统计巨大的numpy(HDF5)数组

4

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

numpy.average(HDF5_file)

我遇到了一个MemoryError错误。似乎是numpy试图将HDF5文件加载到内存中以执行平均值操作?

有没有什么优雅且高效的解决方案来解决这个问题?

1个回答

8
折叠 240000000 个值需要几行代码才能有效地运作。Numpy 的工作方式是将所有数据加载到内存中,因此您无法像发现的那样天真地加载数据。您需要将问题分成块,并使用映射/缩小方法:
- 选择块大小(根据内存限制) - 将数据分成这个大小的块(通过创建多个文件或一次只加载一个块) - 对于每个块,计算平均值并卸载数据 - 将平均值合并到最终结果中。
您可以使用 from_buffer 和 count & offset 参数来加载部分数据。
编辑
您可以尝试使用 Python 分析器检查相对成本。
如果主要成本是处理成本,则可以尝试使用 multiprocess 库的进程池或 numpy 的并行版本进行并行化。或者使用 pyopencl 等 GPGPU 库。
如果处理时间等同于加载时间,您可以尝试使用多进程库将这两个任务进行流水线处理。创建一个线程来加载数据并将其提供给处理线程。
如果主要成本是加载时间,则问题更大。您可以尝试在不同的计算机上分配任务(使用网格库来管理数据复制和任务分发)。

我尝试将数据分成较小的块。虽然它可以工作,但似乎需要非常长的时间。使用 from_buffer 技术能提高性能吗? - Onlyjus
@Onlyjus 是的,它会接受。如果我没记错的话,numpy函数接受可迭代对象。但是当给定一个时,加载将使用Python for循环完成。frombuffer将使用c函数并且速度更快。请注意正确设置dtype参数并检查您的数据的numpy解释是否正确。 - Simon Bergot
我没有看到使用frombuffer技术带来的性能提升。也许慢速度只是因为从硬盘读取文件的原因。 - Onlyjus
谢谢你的帮助。你基本上回答了我的问题。我只需要做一些工作来优化它。 - Onlyjus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接