python - 巨大 numpy (HDF5) 阵列的统计数据

标签 python numpy python-2.7 h5py

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

numpy.average(HDF5_file)

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

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

最佳答案

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

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

你可以使用from_buffer使用计数和偏移量参数来加载部分数据。

编辑

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

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

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

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

关于python - 巨大 numpy (HDF5) 阵列的统计数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12264309/

相关文章:

python - 永久添加目录到 PYTHONPATH?

python - Django Social Auth w/Twitter : HTTP 401 Error (Unauthorized)

python - 如何使用十进制数/数据与 python 3 检查相关性

python - 如何在 Ubuntu 16.04 上完全卸载 python 2.7.13

python - 设置 Django 以使用 MySQL

python - 确定 ‘data’ 的平均值,其中 CONTINUOUS cond=True 的最高数量

python - 处理浮点: With numpy python in particular

python - 根据第一列然后下一列排序

mysql - Python-Sqlalchemy 二进制列类型 HEX() 和 UNHEX()

python - 如何检查文本文件中的用户名,然后询问密码?