使用 Numpy 加载文本时出现内存错误

Memory error when using Numpy load text

当我使用以下代码使用 numpy 加载 csv 文件时

F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6))
MASS = F[:,4]
#print(MASS)
Z = F[:,6]
N = len(MASS)
print(len(MASS))

我收到以下错误

Traceback (most recent call last):
File "C:\Users\Codes\test2.py", line 16, in <module>
F = np.loadtxt(F,skiprows=1, delimiter=',',usecols=(2,4,6))
File "C:\Python34\lib\site-packages\numpy\lib\npyio.py", line 859, in   loadtxt
X.append(items)
MemoryError

我有 24Gb 如果物理内存和文件是 2.70Gb 所以我不明白为什么我会收到这个错误。谢谢!

编辑

我也试过像这样加载相同的文件

f = open(F)           #Opens file
f.readline()          # Strips Header
nlines = islice(f, N) #slices file to only read N lines


for line in nlines:              
 if line !='':
      line = line.strip()
      line = line.replace(',',' ') #Replace comma with space
      columns = line.split()
      tid = columns[2]
      m = columns[4]  
      r = columns[6]               # assigns variable to columns
      M.append(m)
      R.append(r)                       #appends data in list
      TID.append(tid)



print(len(MASS))      

又遇到一个内存错误。

 Traceback (most recent call last):
  File "C:\Users\Loop test.py", line 58, in <module>
     M.append(m)
    MemoryError

在这种情况下,似乎在构建第一个列表时 运行 内存不足 M

我认为问题是需要连续内存来加载 2.7GB 数据。由于数据结构和语言实用程序,它的内存也很可能超过 2.7。最好使用同一文件的块或使用类似 HDF5 的数据结构。 http://www.h5py.org/

首先,我会检查您实际上使用的是 python 的 64 位版本。在 Windows 上,以 32 位构建结束是很常见的,即使在 64 位系统上也是如此。

尝试:

import platform
print(platform.architecture()[0])

如果您看到 32bit,那是您的问题。一个 32 位的可执行文件只能寻址 2GB 的内存,所以你永远不能拥有超过 2GB 的数组(或其他对象)。


然而,loadtxt 效率相当低,因为它通过构建 list 然后将其转换为 numpy 数组来工作。您的示例代码做同样的事情。 (pandas.read_csv 效率更高,并且经过高度优化,如果您碰巧有 pandas。)

A list 是一种内存效率比 numpy 数组低得多的结构。它类似于指针数组。换句话说,列表中的每个项目 都有额外的 64 位。

如果您需要 "leaner" 文本 I/O,您可以使用 numpy.fromiter 对此进行改进。更完整的讨论见Python out of memory on large CSV file (numpy)(无耻插件)。


不过,我不认为你的问题是loadtxt。我认为这是 python 的 32 位版本。