我正在开发一个涉及多个物理场和模拟器的 Monte Carlo 模拟软件包。我需要进行在线分析,跟踪派生数据对原始数据的依赖性,并执行诸如“给我温度> 400 和 (x0,y0) 附近位置的波形”之类的查询。所以内存中的数据模型比较复杂。
应用程序是用 Python 编写的,每个模拟结果都被建模为一个 Python 对象。 它每小时产生约 100 个结果(对象)。大多数对象都有大量数据(几 MB 的二进制数字数组),以及一些轻型数据(温度、位置等)。总数据生成速率为每小时几 GB。
我需要一些数据持久性解决方案和易于使用的查询 API。 我已经决定将大量数据(数字数组)存储在 HDF5 存储中。 我正在考虑使用 MongoDB 作为对象持久性(仅限轻数据),以及在 HDF5 中索引重数据。 MongoDB 的对象持久性很简单,查询接口(interface)看起来足够强大。
我知道 sqlalchemy+sqlite 选项。但是,SqlAlchemy 似乎不自然地支持将大量数据流式传输到 HDF5,并且固定模式很麻烦。
我知道这篇文章( Searching a HDF5 dataset ),但“索引表”本身需要一些内存索引以进行快速查询。
我想知道在我加入之前是否应该考虑其他替代解决方案?还是我在计划中忽略了任何问题?
TIA。
最佳答案
关于 Mongo 的一些知识可能与您描述的情况有关,以及为什么它可能很适合:
I need to do online analysis, track of the dependency of derived data on raw data, and perform queries like "give me the waveforms for temperature>400 and position near (x0,y0)".
Mongo 有一种灵活的查询语言,可以很容易地进行这样的查询。还支持地理空间 (2D) 索引 - 此外,如果您需要非常频繁地查询位置和温度,您可以在 (温度、位置) 上创建复合索引,这将确保查询始终执行良好。
Most objects have heavy data (several MB of binary numeric array), as well as some light data (temperature, position etc).
MongoDB 中的每个文档最多可以容纳 16MB 的数据,并且还支持二进制字段类型 - 所以将几兆二进制嵌入到一个字段中,并通过查询其他字段来检索它会相对简单数据。如果您预计需要超过 16MB,您还可以使用 mongodb 的 GridFS API,它允许您在磁盘上存储任意大的二进制数据 block 并快速检索它们。
The total data generate rate is several GB per hour.
对于像这样一个快速增长的大型数据集,您可以创建一个分片设置,该设置将允许您添加服务器以适应大小,无论它可能有多大。
关于python - 科学模拟数据的数据持久化,Mongodb + HDF5?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8998564/