为什么Python在剩余大量内存时使用list的`append()`出现`Memory Error`
我正在从一组文本文件中建立一个大型的数据字典。在读取这些文件的内容并处理时,我会用 append(dataline)
把每一行添加到一个列表里。
但是在某个时刻,使用 append()
时出现了 Memory Error
的错误。不过,我在Windows任务管理器中观察程序运行时,发现此时还有4.3 GB的可用内存和1.1 GB的空闲内存。
所以我不明白为什么会出现这个错误。
我使用的Python版本是2.6.6。我猜想,唯一的原因可能是它无法使用更多的可用内存。如果真是这样,有没有办法增加内存的分配呢?
5 个回答
我之前也遇到过类似的问题,那时我在64位的Windows系统上用的是32位的Python。后来我试了64位的Python版本,但很快就遇到了与64位Windows兼容的Scipy库的问题。
我找到的完全免费的解决方案是:
1) 安装VirtualBox
2) 在虚拟机上安装CentOS 5.6
3) 获取Enthought Python Distribution(免费的64位Linux版本)。
现在,我所有依赖于Numpy、Scipy和Matplotlib的Python代码都可以使用我电脑上所有的内存和可用的Linux交换空间。
如果你愿意重新组织一下代码,而不是单纯增加更多的内存,你可以试试这个方法:
data = (processraw(raw) for raw in lines)
这里的 lines
可以是一个行的列表,或者是 file.xreadlines()
之类的东西。
如果你在用32位的Python版本,可能可以试试64位的版本。
使用32位地址的程序最多只能使用4GB的内存,但实际上(这取决于操作系统),通常能用的内存会更少。听起来你的Python程序可能已经碰到这个限制了。而64位的地址方式就解决了这个问题,可以使用更多的内存。
补充说明 既然你在问关于Windows的事,下面这个页面可能对你有帮助:Windows版本的内存限制。你可以看到,32位程序的内存限制是2GB、3GB或4GB,这取决于操作系统的版本和设置。