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

Python 使用Numpy加载文本时出现内存错误,python,memory,numpy,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)) 我得到以下错误 Traceback (most recent call last): File "C:\Users\Codes\test2.py", line 16, in <modul

当我使用以下代码使用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
还有一个内存错误

 Traceback (most recent call last):
  File "C:\Users\Loop test.py", line 58, in <module>
     M.append(m)
    MemoryError
回溯(最近一次呼叫最后一次):
文件“C:\Users\Loop test.py”,第58行,在
M.append(M)
记忆者

在这种情况下,在构建第一个列表时,它似乎内存不足。我认为,问题在于需要连续内存才能加载2.7GB的数据。由于数据结构和语言实用程序的原因,它在内存中可能也超过了2.7。最好使用相同文件的块或使用类似HDF5的数据结构

首先,我要检查您是否实际使用了64位python版本。在Windows上,即使在64位系统上,通常也会生成32位版本

尝试:

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


但是,
loadtxt
效率相当低,因为它通过构建
列表,然后将其转换为numpy数组来工作。您的示例代码也做了同样的事情。(
pandas.read_csv
效率更高,而且优化程度更高,如果你身边碰巧有
pandas

列表
的内存效率远远低于numpy数组。它类似于指针数组。换句话说,列表中的每个项目都有额外的64位

如果您需要“更精简”的文本I/O,您可以使用
numpy.fromiter
对此进行改进。有关更完整的讨论,请参阅(无耻插件)



尽管如此,我不认为您的问题是
loadtxt
。我认为这是一个32位的python构建

分配2.70Gb阵列存在问题。它需要2.70 Gb的连续内存。任何机器都会与之斗争。我建议找到一种将这些数据分块处理的方法。或者看看numpy的memmap功能:您只需要2.7GB的连续虚拟内存,提供这一功能应该没有任何问题,因为在现代机器上虚拟地址空间大得惊人。
loadtxt()
很可能会复制数据,可能是多次,并且内部分配的数据比原始文件占用的数据要多。@SvenMarnach有没有办法检查
loadtext()
是否有额外的副本?@SvenMarnach可能就在这里。
loadtxt
有点效率低下
pandas.read_csv
loadtxt
更高效,但您也可以轻松地“滚动您自己的”loadtxt,这将对内存更友好。值得一提的是,看看您是否正确,它说我运行的是
python3.4的
32位
版本,但运行的是
python3.3.2的64位
版本。我是否应该卸载并重新安装
64位
版本
3.4
?@Surfcast23-这完全取决于您。使用
3.3
没有什么错,如果这是安装为64位并正常工作的。
 Traceback (most recent call last):
  File "C:\Users\Loop test.py", line 58, in <module>
     M.append(m)
    MemoryError
import platform
print(platform.architecture()[0])