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



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

numpy.average(HDF5_file)

我得到了MemoryError。似乎numpy试图将HDF5文件加载到内存中以执行平均?

有人能优雅有效地解决这个问题吗?

折叠240000000个值需要几行代码才能有效工作。Numpy的工作原理是将所有数据加载到内存中,因此您将无法像发现的那样天真地加载数据。您必须将问题分成若干块,并使用映射/减少方法:

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

您可以将from_buffer与count一起使用;偏移参数以加载部分数据。

编辑

您可以尝试使用python探查器来检查相对成本是多少。

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

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

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

最新更新