根据评论的讨论,我将发布此答案。我已经看到这个问题多次出现,但没有被接受的答案。
内存错误是直观的 - 内存不足。但有时解决或调试此错误很令人沮丧,因为您拥有足够的内存,但错误仍然存在。
1)检查代码错误
这可能是一个“愚蠢的步骤”,但这就是为什么它首先出现的原因。确保没有无限循环或明知需要很长时间的操作(例如使用会搜索整台计算机并将输出放入Excel文件中的os
模块)。
2)使代码更有效率
与步骤1相似。但如果某些简单的任务需要很长时间,通常有一个更快且更节省内存的模块或方法来完成同样的任务。这就是Python和/或开源语言的美妙之处!
3)检查对象的总内存
第一步是检查对象的内存。关于这个问题,在Stack上有很多线程,所以你可以搜索它们。流行的答案在这里和这里。
要找到对象的大小,您可以始终使用sys.getsizeof()
:
import sys
print(sys.getsizeof(OBEJCT_NAME_HERE))
现在可能会在任何东西创建之前发生错误,但如果你按块读取csv文件,可以查看每个块使用了多少内存。
4) 运行时检查内存
有时候你拥有足够的内存,但是你正在运行的函数消耗了大量内存。这会导致内存峰值超出实际完成对象的大小,从而导致代码/进程出错。实时检查内存需要花费很长时间,但是可以做到。Ipython很擅长这方面。请参考他们的文档。
使用以下代码可以在Jupyter Notebook中直接查看文档:
%mprun?
%memit?
使用示例:
%load_ext memory_profiler
def lol(x):
return x
%memit lol(500)
如果你需要魔术函数的帮助,这篇文章非常棒
5) 这个可能是第一步...但检查一下简单的东西,比如位版本
像在你的情况下,简单地切换你运行的Python版本就可以解决问题。
通常上述步骤解决了我的问题。
csv
版本和dta
版本的文档,两个版本在64位的Python/pandas 0.13.1环境下都能正常工作。csv
文件的峰值内存使用量为3.33G,而dta
文件则为3.29G。这个内存使用量接近32位版本可能会卡壳的范围。所以@Jeff的问题是非常好的。 - Karl D.