【问题标题】:Statistics on huge numpy (HDF5) arrays大型 numpy (HDF5) 数组的统计信息
【发布时间】:2012-08-29 03:53:04
【问题描述】:

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

numpy.average(HDF5_file)

我收到了MemoryError。好像numpy试图将HDF5文件加载到内存中进行平均?

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

【问题讨论】:

    标签: python numpy python-2.7 h5py


    【解决方案1】:

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

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

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

    编辑

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

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

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

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

    【讨论】:

    • 我尝试将数据缩减为更小的块。但是它有效,它似乎需要很长的时间。 from_buffer 技术会提高性能吗?
    • @Onlyjus 是的,它会的。如果我没记错的话,numpy 函数接受迭代。但是当给出一个时,加载是使用 python for 循环完成的。 frombuffer 将与 c 函数一起使用并且会更快。注意正确设置 dtype 参数并检查数据的 numpy 解释是否正确。
    • 我没有看到使用 frombuffer 技术带来的性能提升。也许速度慢只是从硬盘驱动器中读取文件。
    • 感谢您的帮助。你基本上回答了我的问题。我只需要做一些腿部工作来优化它。
    猜你喜欢
    • 2021-06-11
    • 2016-11-29
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2016-07-16
    • 1970-01-01
    • 2016-11-15
    相关资源
    最近更新 更多