大型 numpy (HDF5) 数组的统计信息

Posted

技术标签:

【中文标题】大型 numpy (HDF5) 数组的统计信息【英文标题】:Statistics on huge numpy (HDF5) arrays 【发布时间】:2012-08-29 03:53:04 【问题描述】:

我有相当大的 4D 数组 [20x20x40x15000],我使用 h5py 将它们作为 HDF5 文件保存到磁盘。现在的问题是我想计算整个数组的平均值,即使用:

numpy.average(HDF5_file)

我收到了MemoryError。好像numpy试图将HDF5文件加载到内存中进行平均?

有没有人对这个问题有一个优雅而有效的解决方案?

【问题讨论】:

【参考方案1】:

折叠 240 000 000 个值需要几行代码才能有效工作。 Numpy 通过将所有数据加载到内存中来工作,因此您将无法像您发现的那样天真地加载数据。您必须将问题分成几块,并使用 map/reduce 方法:

选择一个块大小(根据内存限制) 将数据分成这个大小的块(通过创建多个文件,或者一次只加载一个块) 对于每个块,计算平均值并卸载数据 将平均值合并到最终结果中。

您可以使用from_buffer 与计数和偏移参数来加载部分数据。

编辑

您可以尝试使用 python profiler 来检查相对成本。

如果主要成本是处理,您可以尝试使用多进程库中的进程池或 numpy 的并行版本将其并行化。或者使用 GPGPU 库,例如 pyopencl。

如果处理时间等于加载时间,您可以尝试使用多处理库对这两个任务进行流水线处理。创建一个线程来加载数据并将其提供给处理线程。

如果主要成本是加载时间,那么问题就更大了。您可以尝试将任务划分在不同的计算机上(使用网格库来管理数据复制和任务分发)。

【讨论】:

我尝试将数据缩减为更小的块。但是它有效,它似乎需要很长的时间。 from_buffer 技术会提高性能吗? @Onlyjus 是的,它会的。如果我没记错的话,numpy 函数接受迭代。但是当给出一个时,加载是使用 python for 循环完成的。 frombuffer 将与 c 函数一起使用并且会更快。注意正确设置 dtype 参数并检查数据的 numpy 解释是否正确。 我没有看到使用 frombuffer 技术带来的性能提升。也许速度慢只是从硬盘驱动器中读取文件。 感谢您的帮助。你基本上回答了我的问题。我只需要做一些腿部工作来优化它。

以上是关于大型 numpy (HDF5) 数组的统计信息的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法让一个 numpy 样式的视图查看存储在 hdf5 文件中的数组切片?

14numpy——统计函数

numpy模块

将 HDF5 文件中的大型数据集读入 x_train 并在 keras 模型中使用

Python机器学习(四十五)NumPy 统计函数

NumPy 中的数据统计分析