Python 使用Numpy加载文本时出现内存错误
当我使用以下代码使用numpy加载csv文件时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
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])