我有一个很大的numpy保存文件(可能比内存大小还要大)。dtype
是object
(它是一个可变长度numpy数组的numpy数组)。在
Can I avoid reading the entire file into memory?
E.g. build a generator to read elements iteratively.
使用标准numpy dtypes
np.load(filename, mmap_mode='r')
可以做到这一点,但不能将mmap_mode
用于对象数据类型。在
有没有可能我可以通过读卡器流式传输字节?还是我不知道的另一个把戏?在
你可能想看看numpy memmap。在
根据官方文件:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.memmap.html
非对象数据类型的基本格式是一个头块(包括shape、dtype、stripes等),后面是其数据缓冲区的字节副本。在
换句话说,类似于这个序列的东西:
但如果我将dtype更改为object:
^{pr2}$这些数据缓冲区字节指向内存中的位置。因为这些都是小整数,所以它们可能指向唯一的缓存值
如果元素是数组,它们将指向存储在内存中其他地方的数组(指向
ndarray
对象,而不是它们的数据缓冲区)。在要处理这样的对象,
np.save
使用pickle。现在,ndarray
的pickle是它的save
字符串。我不知道np.save
将这些字符串放在哪里。可能在后面的文件中使用指向流的指针。在您/我们必须研究
np.save
(和函数调用)来确定如何保存这些数据。我已经了解了如何从一个文件中保存和加载多个数组,但没有关注对象dtype布局。相关代码在numpy/lib/npyio.py
,numpy/lib/format.py
format
文件有一个关于保存格式的doc块。在如果非对象
write_array
使用array.tofile(fp)
。如果object
,则使用pickle.dump(array, fp)
类似地,}。在
read_array
使用np.fromfile(fp, dtype)
和{所以这意味着我们需要深入研究
array
pickle.dump
是如何完成的。在相关问题 更多 >
编程相关推荐