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

Best approach to storing scientific data sets on disk C++

本文关键字:数据集 最佳 方法 磁盘 C++ 存储      更新时间:2023-10-16

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

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

所以,我想知道你们有什么建议。也许您有一种不那么痛苦的方式来使用 HDF5,同时最大限度地提高性能。或者,也许您知道一个NoSQL数据库,可以很好地存储此类数据。或者也许我走错了方向,你想给我一些感觉。

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

自己一些感觉,并使用生产级库,如HDF5。 所以你觉得它太复杂了,但是你找到它的高级API了吗?

如果您不喜欢这个答案,请尝试新兴的阵列数据库之一,例如SciDB,rasdaman或MonetDB。 不过,我怀疑,如果你在HDF5上大吃一惊,你就会对其中任何一个大吃一惊。

在我看来,根据

我的经验,如果你打算在任何时间长度内使用大型科学数据集,那么学习如何正确使用HDF5这样的工具是值得的。 如果你拿起一个工具,比如NoSQL数据库,它不是为手头的任务而设计的,那么,虽然它最初可能更容易使用,但最终(我猜不久之后(它将缺乏你需要或想要的功能,你会发现自己不得不围绕它的缺陷进行编程。

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

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

我从事

科学计算工作多年,我认为HDF5或NetCDF是一种很好的数据格式。它可以提供高效的并行读取/导航,这对于处理大数据非常重要。

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

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