如何在numpy中输入非常大的数据?

How to input a very large data in numpy?

我有一个非常大的数据文件(大约 70 Mb),我想处理该文件。 我试图分块处理它,但它仍然很慢。我想使用 numpy.frombuffer 对数据进行排队并一次处理大约 1 Mb 的数据,这样它就不会填满内存。

我收到这个错误:

buffer size must be a multiple of element size

示例输入如下:array([0, 0, 0, 0, 0], dtype=int16)

根据您的评论,听起来您正在读取一个 int16 数组,然后 "de-interleaving" 将它们转换为复数。

您目前正在做类似的事情:

d_short = np.fromfile(filename, dtype=np.int16)
data = np.array([np.complex(d_short[i], d_short[i+1]) for i in np.arange(...)])

慢的是第二行

您正在创建一个大的临时列表,并通过遍历 numpy 数组来创建它。在 Python 中遍历 numpy 数组比遍历列表慢得多。尽可能避免它。此外,列表理解将生成一个临时列表,该列表在内存中比原始数组大很多

使用切片代替迭代。在这种情况下,它相当于:

data = d_short[::2] + d_short[1::2] * 1j

这将创建一个临时数组,但这应该不是问题。但是,如果您真的很关心内存使用情况,您可以考虑这样的事情:

data = np.zeros(d_short.size // 2, dtype=np.complex64)
data.real, data.imag = d_short[::2], d_short[1::2]

虽然可读性差很多,但它确实有一些优点。

  1. 没有创建临时数组,所以我们只需要d_shortdata
  2. 使用的内存量
  3. 我们没有创建 np.complex128 数组,而是创建了 np.complex64 数组(两个 32 位浮点数),它将使用一半的内存。因为您输入的是 16 位整数,所以没有精度损失。