Python 有关巨型numpy(HDF5)阵列的统计信息

Python 有关巨型numpy(HDF5)阵列的统计信息,python,numpy,python-2.7,h5py,Python,Numpy,Python 2.7,H5py,我有相当大的4D阵列[20x20x40x15000],我使用它作为HDF5文件保存到磁盘。现在的问题是,我想计算整个阵列的平均值,即使用: numpy.average(HDF5_file) 我得到一个内存错误。似乎numpy试图将HDF5文件加载到内存中以执行平均值 是否有人有一个优雅而有效的解决方案来解决这个问题?折叠24万个值需要几行代码才能有效工作。Numpy的工作原理是将所有数据加载到内存中,因此您无法在发现数据时天真地加载数据。您必须将问题分为多个部分,并使用map/reduce方法

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

numpy.average(HDF5_file)
我得到一个
内存错误
。似乎numpy试图将HDF5文件加载到内存中以执行平均值


是否有人有一个优雅而有效的解决方案来解决这个问题?

折叠24万个值需要几行代码才能有效工作。Numpy的工作原理是将所有数据加载到内存中,因此您无法在发现数据时天真地加载数据。您必须将问题分为多个部分,并使用map/reduce方法:

  • 选择块大小(根据内存限制)
  • 将数据分成此大小的块(通过创建多个文件或一次只加载一个块)
  • 对于每个区块,计算平均值并卸载数据
  • 将平均数合并到最终结果中
您可以使用count&offset参数来加载部分数据

编辑

您可以尝试使用python分析器来检查相对成本

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

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


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

我尝试将数据缩减为较小的数据块。然而,这是可行的,似乎需要花很长的时间。from_buffer技术会提高性能吗?@只有jus是的,它会。如果我没记错的话,numpy函数接受iterrables。但是当给出一个循环时,加载是使用python for循环完成的。frombuffer将与c函数配合使用,速度更快。请注意正确设置dtype参数,并检查数据的numpy解释是否正确。我没有看到使用frombuffer技术的性能提升。可能是从硬盘读取文件的速度太慢了。谢谢你的帮助。你基本上回答了我的问题。我只需要做腿部工作来优化它。