Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在numpy中输入非常大的数据?_Python_Arrays_Numpy_Buffer - Fatal编程技术网

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

Python 如何在numpy中输入非常大的数据?,python,arrays,numpy,buffer,Python,Arrays,Numpy,Buffer,我有一个非常大的数据文件(大约70MB),我想处理这个文件。 我试着把它分块处理,但仍然很慢。我想使用numpy.frombuffer对数据进行排队,一次处理大约1MB的数据,这样就不会填满内存 我得到这个错误: buffer size must be a multiple of element size 示例输入如下:数组([0,0,0,0,0],dtype=int16)根据您的评论,听起来您正在读取int16的数组,然后将它们“反交错”为复数 您当前正在执行以下操作: d_short =

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

我得到这个错误:

buffer size must be a multiple of element size

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

根据您的评论,听起来您正在读取
int16
的数组,然后将它们“反交错”为复数

您当前正在执行以下操作:

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(...)])
data = np.zeros(d_short.size // 2, dtype=np.complex64)
data.real, data.imag = d_short[::2], d_short[1::2]
慢的部分是第二行

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

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

data = d_short[::2] + d_short[1::2] * 1j
这将创建一个临时数组,但这不应该是一个问题。但是,如果你真的担心内存使用情况,你可能会考虑类似的事情:

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(...)])
data = np.zeros(d_short.size // 2, dtype=np.complex64)
data.real, data.imag = d_short[::2], d_short[1::2]
虽然这是相当不可读,但它确实有一些优势

  • 没有创建临时数组,因此我们只需要
    dushort
    数据所使用的内存量
  • 我们不是创建
    np.complex128
    数组,而是创建
    np.complex64
    数组(两个32位浮点),它将使用一半的内存。因为您输入的是16位整数,所以不会丢失精度

  • 在大多数现代机器上,70Mb似乎还不足以填满你的内存。你在什么硬件上运行这个?”…它仍然很慢。“什么是慢的?”?读取文件?处理数据?你在用这些数据做什么?此外,文件是二进制格式还是文本格式?需要更多信息。如果矩阵太大,无法装入核心RAM,您是否考虑过尝试numpy的memmapped阵列结构?它支持像“常规”内存阵列一样方便的切片,但只从磁盘读取访问的切片。你在做什么样的处理?数据文件的格式是什么(csv、二进制、np.save等)?看起来70Mb大约占内存的1.75%。为什么不把它全部拉进去?