如何在使用python时清理内存?

时间:2014-03-18 02:51:37

标签: python

我正在处理我在ipython笔记本中打开的相当大的数据框和文本文件(数千个文档)。我注意到一段时间后,我的电脑变得非常慢。有没有办法清点我的python程序,找出什么减慢了我的电脑?

2 个答案:

答案 0 :(得分:1)

您有几个选择。首先,您可以使用第三方工具(如heapyPySizer)来评估程序中不同位置的内存使用情况。 This(现已结束)所以问题稍微讨论了一下。此外,第三个选项简称为“memory_profiler'托管here on GitHub,并根据this blog在IPython中为memory_profiler提供了一些特殊的快捷方式。

确定消耗最多内存的数据结构后,有几个选项:

  1. 重构利用垃圾收集
    通过您的程序检查数据流,看看是否有任何地方需要保留大型数据结构。如果你有一个大型数据结构,你可以进行一些处理,将该处理放在一个函数中并返回处理结果,这样原来的内存耗尽就会超出范围并被销毁。
    使用del语句建议的评论。虽然评论者是正确的,它会释放内存,但它确实应该告诉你,你的程序没有正确的结构。 Python有很好的垃圾收集,如果你发现自己手动搞乱内存释放,你应该把代码段放在一个函数或方法中,让垃圾收集器做它的事情。

  2. 临时文件
    如果您确实需要(几乎)同时访问大型数据结构,请考虑在不需要时将其中一个或多个写入临时文件。您可以使用JSONPickle库以复杂的格式编写内容,或者只需将pprint数据写入文件,然后再将其读回。
    我知道这似乎是某种手动硬盘抖动,但它可以很好地控制对硬盘进行写入和读取时。此外,在这种情况下,只有您的文件在磁盘上打开和关闭。当你耗尽你的内存并开始交换时,所有都会被反弹 - 数据文件,程序指令,内存页表等......一切都停止而不只是你的程序运行一点点更慢。

  3. 购买更多内存
    是的,这是一个选择。但是像del语句一样,通常可以通过更仔细的数据抽象来避免它,并且应该是最后的手段,保留用于特殊情况。

答案 1 :(得分:1)

iPython这是一个很棒的工具,但有时它往往会减慢速度。

如果您有大量print输出语句,大量图形或代码变得过大,autosave需要永远拍摄笔记本。尝试使用以下方法进行自动保护:

%autosave 300

或者完全禁用它:

%autosave 0