将科学数据集存储在磁盘C ++上的最佳方法

时间:2013-10-06 14:59:51

标签: c++ performance nosql hdf5 scientific-computing

我目前正在开发一个需要使用千兆字节科学数据集的项目。数据集采用整数和浮点数的非常大的数组(30,000个元素)的形式。这里的问题是它们太大而不适合内存,所以我需要一个磁盘上的解决方案来存储和使用它们。为了使这个问题更加有趣,我被限制使用32位架构(因为这是为了工作),我需要尝试最大化此解决方案的性能。

到目前为止,我已经使用了HDF5,它工作正常,但我发现它有点太复杂了。所以,我认为下一个最好的事情是尝试一个NoSQL数据库,但我找不到一个很好的方法将数组存储在数据库中,而不是将它们转换为字符数组并存储它们,这会导致很多坏指针头疼。

所以,我想知道你们推荐什么。也许你在使用HDF5时不那么痛苦,同时最大限度地提高性能。或者您可能知道NoSQL数据库适用于存储此类数据。或者也许我正朝着完全错误的方向前进,你想对我有些感觉。

无论如何,我很感激你们能给我的任何智慧之词:)

3 个答案:

答案 0 :(得分:3)

对自己有所了解,并使用生产级库,如HDF5。所以你觉得它太复杂了,但是你找到了high-level APIs吗?

如果您不喜欢该答案,请尝试其中一个新兴的阵列数据库,例如SciDBrasdamanMonetDB。但我怀疑,如果你对HDF5进行了抨击,那么你就会对这些事件感到厌恶。

在我看来,经验,如果你要在任何时间内使用大型科学数据集,那么学习如何正确使用HDF5等工具是值得的。如果你拿起一个NoSQL数据库这样的工具,它不是为手头的任务而设计的,那么,虽然它最初可能更容易使用,但最终(在很长时间之后我会猜测)它将缺少你需要的功能或希望你会发现自己不得不围绕它的不足做好准备。

为工作选择一个合适的工具,并学习如何正确使用它。

答案 1 :(得分:2)

假设您的数据集确实足够大(例如,而不是30,000个元素,30,000x30,000的双精度数组),您可能需要考虑STXXL。它提供的接口旨在(并且很大程度上成功)模仿C ++标准库中的集合,但是它们的目的是处理太大而无法容纳在内存中的数据。

答案 2 :(得分:2)

我多年来一直致力于科学计算,我认为HDF5或NetCDF是一种很好的数据格式供您使用。它可以提供高效的并行读/写,这对于处理大数据非常重要。

另一种解决方案是使用阵列数据库,如SciDB,MonetDB或RasDaMan。但是,如果您尝试将HDF5数据加载到阵列数据库中,那将会很痛苦。我曾经尝试将HDF5数据加载到SciDB中,但它需要一系列数据转换。您需要知道是否要经常查询数据。如果不经常,那么耗时的装载可能是不值得的。

您可能对this paper感兴趣。 它允许您使用SQL直接查询HDF5数据。

相关问题