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

Str*_*247 2 python memory numpy

当我使用以下代码使用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))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

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
Run Code Online (Sandbox Code Playgroud)

我有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))      
Run Code Online (Sandbox Code Playgroud)

并得到另一个内存错误.

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

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

Joe*_*ton 6

首先,我会检查你实际上是在使用64位构建的python.在Windows上,即使在64位系统上,也常常使用32位版本.

尝试:

import platform
print(platform.architecture()[0])
Run Code Online (Sandbox Code Playgroud)

如果你看32bit,这是你的问题.32位可执行文件只能处理2GB内存,因此您永远不会有超过2GB的阵列(或其他对象).


但是,loadtxt效率相当低,因为它通过构建a list然后将其转换为numpy数组来工作.您的示例代码执行相同的操作.(pandas.read_csv如果您碰巧有更好的效率和非常优化的话pandas.)

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

numpy.fromiter如果您需要"更精简"的文本I/O,可以使用它来改进.请参阅大型CSV文件(numpy)上的Python内存不足以进行更完整的讨论(无耻插件).


尽管如此,我不认为你的问题是loadtxt.我认为这是一个32位的python版本.