问题描述
给定一个数值的二进制文件,我可以使用 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
的数据。我想通过直接读入 tmp
来避免由 a
引起的内存损失。请注意,虽然
a[:size_chunk] = np.fromfile(f,count=size_chunk)
隐藏tmp
变量,不必要的临时内存还在。
我想像这样
np.fromfile(f,count=size_chunk,into=a[:chunk_size])
虽然没有实现这样的 into
关键字。
我怎样才能做到这一点?我也愿意使用 SciPy 或其他 Python 包。我会注意到 H5Py 包有一个 read_direct()
可以满足我的要求,除了我的数据文件是原始二进制文件而不是 HDF5 格式。
解决方法
我正在阅读有关 https://letsencrypt.org/docs/client-options/ 的文章,它提到了 buffer protocol;对于此类问题,SO 上有几个问题,例如 readinto,其中一些建议使用 readinto。
原始答案:虽然这应该可以通过自定义 C 扩展实现,但这也是一种矫枉过正。
我认为单独使用 numpy 是不可能的,您必须进行自己的 C 扩展。我查看了 1 所以可能有一些我遗漏的东西,但是按照设计,python 会为你的缓冲区分配内存,如果 numpy 开发人员尊重这个设计选择,那么除了编写你自己的 C 扩展之外没有什么可做的支持这种情况。