【问题标题】:NumPy: Read binary file into existing arrayNumPy:将二进制文件读入现有数组
【发布时间】:2021-04-29 09:01:24
【问题描述】:

给定一个数值二进制文件,我可以使用numpy.fromfile() 读取它。这为数据分配了一个新数组。假设我已经有一个数组a,我想读入这个数组。我不得不做类似的事情

import numpy as np

size       = 1_000_000_000
size_chunk = 1_000_000
a = np.empty(size, dtype=np.double)
with open('filename', 'rb') as f:
    tmp = np.fromfile(f, dtype=np.double, count=size_chunk)
a[:size_chunk] = tmp

一般a 比读入tmp 的数据大。我想通过直接读入a 来避免tmp 造成的内存损失。请注意,虽然

a[:size_chunk] = np.fromfile(f, dtype=np.double, count=size_chunk)

隐藏tmp变量,不必要的临时内存还在。

我想像

np.fromfile(f, dtype=np.double, count=size_chunk, into=a[:chunk_size])

虽然没有实现这样的into 关键字。

我怎样才能做到这一点?我也愿意使用 SciPy 或其他 Python 包。我会注意到 H5Py 包有一个 read_direct() 可以满足我的要求,除了我的数据文件是原始二进制文件而不是 HDF5 格式。

【问题讨论】:

  • 我认为您必须自己使用openstruct 读取数据,并在循环中将其分配给您的数组。正如您所注意到的,没有选项可以将已分配的数组传递给fromfile。如果内存是这样的问题,您将不得不使用更小的块。
  • 恐怕与 NumPy/C 实现相比,在 Python 中使用 openstruct 手动操作会很慢。
  • h5py 有很多cython 代码,因此read_direct 使用的是较低级别的数组访问。
  • @jmd_dk 也许numba 可以加快速度,或者您必须自己扩展numpy 功能(如果您想尝试将PR 放到上游)。
  • @JanChristophTerasa Numba 对struct 的许多调用无能为力。我认为正确的做法是用 C/Cython 编写它并提供 Python 包装器。我很遗憾 NumPy 不允许我提供内存缓冲区,因为它已经实现了底层的高效读取。

标签: python numpy binaryfiles hpc fromfile


【解决方案1】:

我正在阅读有关buffer protocol 的信息,其中提到了readinto;对于此类问题,有几个关于 SO 的问题,例如 1,其中一些建议使用 readinto


原始答案:虽然这应该可以通过自定义 C 扩展来实现,但这也是一种矫枉过正。

我认为单独使用 numpy 是不可能的,您必须自己进行 C 扩展。我已经查看了numpy reference,所以我可能错过了一些东西,但是按照设计,python 会为你的缓冲区分配内存,如果 numpy 开发人员尊重这个设计选择,那么除了编写你自己的 C 扩展来支持这个之外,没有什么可做的很正常。

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 2018-08-16
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    相关资源
    最近更新 更多