在磁盘C++上存储科学数据集的最佳方法
Best approach to storing scientific data sets on disk C++
我目前正在做一个需要处理千兆字节科学数据集的项目。数据集采用非常大的整数和浮点数数组(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 数据。
- 在c代码之间共享数据的最佳方式
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 如何实现高效的算法来计算大型数据集的多个不同值?
- HDF5Cpp 扩展复合数据集超板问题
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 在 c++ 中解析数据包数据的最佳方法是什么?
- HDF5 简单读取数据集失败
- std::bad_alloc 在大数据集的 Dijkstra 计算期间
- C++中的多维数据集:从 std::vector 的 2D 数据到 std::vector 的 2D 网格的最干净方法?
- C++创建空 HDF5 文件而不是数据集的代码
- 使用 QT C++过滤大数据的最佳方式
- 跨线程共享数据集与拆分每个线程的数据
- 在wxWidgets的事件中包含我自己的数据的最佳方法是什么?
- 多维数据集ai中的ai_float是什么
- 适用于频繁更改的大型数据集的最佳数据结构
- 使用 jsoncpp 时从 JSon 剥离私有数据的最佳方法
- 组织从内存读取的数据的最佳方法(用于调试)c++
- 将数据集从 R 传递到C++(使用 .呼叫)
- 在磁盘C++上存储科学数据集的最佳方法
- 分析两个数据集相似性的最佳方法