如何在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]
虽然可读性差很多,但它确实有一些优点。
- 没有创建临时数组,所以我们只需要
d_short
和data
使用的内存量
- 我们没有创建
np.complex128
数组,而是创建了 np.complex64
数组(两个 32 位浮点数),它将使用一半的内存。因为您输入的是 16 位整数,所以没有精度损失。
我有一个非常大的数据文件(大约 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]
虽然可读性差很多,但它确实有一些优点。
- 没有创建临时数组,所以我们只需要
d_short
和data
使用的内存量
- 我们没有创建
np.complex128
数组,而是创建了np.complex64
数组(两个 32 位浮点数),它将使用一半的内存。因为您输入的是 16 位整数,所以没有精度损失。