【问题标题】:Read structured binary data one record at a time into numpy buffer一次将一条记录的结构化二进制数据读入 numpy 缓冲区
【发布时间】:2015-02-28 19:25:26
【问题描述】:

我必须从结构化二进制文件中读取数百万条记录。在阅读时,我想将数据转换为更有用的内存布局。每条记录都很大。总文件大小约为 30GB。

我可以使用numpy.fromfile,但是我正在运行的系统有足够的内存仅用于一个完整数组,因此我无法加载整个文件,然后将所有内容复制到最终数组中在内存中,然后销毁最初加载的数组。

我也可以使用numpy.fromfile 来读取块,但我担心numpy.fromfile 每次都会创建和销毁一个新数组,而不是重用缓冲区数组。我还没有对此进行测试,但我怀疑这会导致一些严重的内存峰值和缓慢的垃圾收集。

如果这适用:文件是通过 infiniband 加载的,并且我在其上运行的分析需要我多次循环整个数据集。我将 Cython 用于这些循环,因此欢迎任何可以提供帮助的 C 代码,但我更愿意在 Python 中完成。

【问题讨论】:

  • 听起来您需要为内存映射文件创建代理。

标签: python memory-management numpy buffer binaryfiles


【解决方案1】:

根据您的描述,听起来您可以使用np.memmap 为存储在磁盘上的输入二进制文件创建内存映射。在大多数方面,np.memmap 数组的行为与标准 np.ndarray 相同。您可以像处理普通数组一样对其进行索引,并将其传递给任何接受np.ndarray 的函数。在幕后,您的操作系统将处理读取、缓存和写入二进制文件的适当部分的业务,防止您无意中读取太大而无法放入 RAM 的块。

然后,例如,您可能会创建第二个 memmap 来存储输出,然后迭代您可以在核心内存中处理的输入 memmap 的最大切片,随意变换它们,并将它们写入输出内存映射。

如果您正在寻找一种更好的输出格式来存储您的数据,我强烈建议您也研究一下 HDF5(例如 h5pyPyTables),它提供了可移植性、即时压缩和更快的平均读/写时间,以及其他好处。

【讨论】:

    猜你喜欢
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 2014-11-21
    • 2013-05-20
    • 1970-01-01
    • 2011-04-28
    • 2012-10-03
    • 1970-01-01
    相关资源
    最近更新 更多