科学模拟数据的持久化,Mongodb + HDF5?
我正在开发一个蒙特卡洛模拟软件包,这个软件涉及多个物理模型和模拟器。我需要进行在线分析,跟踪派生数据与原始数据之间的依赖关系,还要执行一些查询,比如“给我温度大于400且位置接近(x0,y0)的波形”。所以,内存中的数据模型相当复杂。
这个应用程序是用Python写的,每个模拟结果都被建模为一个Python对象。每小时大约会产生100个结果(对象)。大多数对象包含大量数据(几MB的二进制数字数组),还有一些轻量级数据(比如温度、位置等)。总的数据生成速度大约是每小时几GB。
我需要一些数据持久化的解决方案,以及一个易于使用的查询接口。我已经决定将大量数据(数字数组)存储在HDF5存储中。我在考虑使用MongoDB来存储对象的持久性(仅限轻量级数据),并为HDF5中的大量数据建立索引。使用MongoDB进行对象持久化相对简单,查询接口看起来也足够强大。
我知道还有sqlalchemy+sqlite这个选项。不过,将大量数据流式传输到HDF5似乎在SqlAlchemy中并不自然支持,而且固定的模式也很麻烦。
我知道这个帖子(搜索HDF5数据集),但“索引表”本身需要一些内存中的索引来加快查询速度。
我想知道在我深入之前,还有没有其他替代方案值得我考虑?或者在我的计划中有没有什么问题我没有注意到的?
谢谢!
2 个回答
你有没有看过 Vistrails 呢?
关于MongoDB,有一些事情你可能需要了解,这些信息可能和你描述的情况有关,也能说明它为什么适合你的需求:
我需要进行在线分析,跟踪派生数据和原始数据之间的依赖关系,并执行像“给我温度大于400且位置接近(x0,y0)的波形”这样的查询。
MongoDB有一种灵活的查询语言,这让你很容易进行这样的查询。它还支持地理空间(2D)索引。如果你需要频繁查询位置和温度,可以在(温度,位置)上创建一个复合索引,这样可以确保查询的速度始终很快。
大多数对象的数据量很大(几MB的二进制数字数组),还有一些轻量级的数据(温度、位置等)。
在MongoDB中,每个文档最多可以存储16MB的数据,并且支持二进制字段类型。所以,把几MB的二进制数据嵌入到一个字段中并通过查询其他字段来检索是相对简单的。如果你预计需要超过16MB的数据,还可以使用MongoDB的GridFS API,它允许你在磁盘上存储任意大的二进制数据,并快速检索。
总的数据生成速率是每小时几GB。
对于这样一个快速增长的大数据集,你可以创建一个分片设置,这样无论数据量多大,都可以添加服务器来适应它的规模。