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