我有相当大的 4D 数组 [20x20x40x15000],我使用h5py作为 HDF5 文件保存到磁盘。现在的问题是我想计算整个数组的平均值,即使用:
numpy.average(HDF5_file)
我得到一个MemoryError
. 似乎 numpy 试图将 HDF5 文件加载到内存中以执行平均?
有没有人对这个问题有一个优雅而有效的解决方案?
我有相当大的 4D 数组 [20x20x40x15000],我使用h5py作为 HDF5 文件保存到磁盘。现在的问题是我想计算整个数组的平均值,即使用:
numpy.average(HDF5_file)
我得到一个MemoryError
. 似乎 numpy 试图将 HDF5 文件加载到内存中以执行平均?
有没有人对这个问题有一个优雅而有效的解决方案?
折叠 240 000 000 个值需要几行代码才能有效工作。Numpy 通过将所有数据加载到内存中来工作,因此您将无法像您发现的那样天真地加载数据。您必须将问题分成几块,并使用 map/reduce 方法:
您可以将from_buffer与 count 和 offset 参数一起使用来加载部分数据。
编辑
您可以尝试使用 python 分析器来检查相对成本是多少。
如果主要成本是处理,您可以尝试使用多进程库中的进程池或 numpy 的并行版本将其并行化。或者使用 GPGPU 库,例如 pyopencl。
如果处理时间等于加载时间,您可以尝试使用多处理库对这两个任务进行流水线处理。创建一个线程来加载数据并将其提供给处理线程。
如果主要成本是加载时间,那么问题就更大了。您可以尝试在不同的计算机上划分任务(使用网格库来管理数据复制和任务分发)。