关于巨大的numpy(HDF5)阵列的统计数据

Onl*_*jus 3 python numpy python-2.7 h5py

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

numpy.average(HDF5_file)
Run Code Online (Sandbox Code Playgroud)

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

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

Sim*_*got 8

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

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

你可以使用from_buffer和count和offset args来加载部分数据.

编辑

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

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

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

如果主要成本是加载时间,则会出现更大的问题.您可以尝试在不同的计算机上划分任务(使用网格库来管理数据复制和任务分配).