内存使用情况,如何释放内存

时间:2012-05-28 08:45:06

标签: python memory memory-management memory-leaks

我正在使用python并且当索引文档(对于搜索引擎)时需要大量的RAM,在我停止索引过程之后内存仍然是满的(比如8gb的RAM)。这很糟糕,因为我需要我的搜索引擎一直工作,而不是在我完成索引时重置操作系统。有没有什么有效的方法来管理庞大的数组,字典和列表,以及如何释放它们。有什么想法吗?

我在stackoverflow上也看到了一些关于它的问题,但它们已经过时了:

Python memory footprint vs. heap size

Profile Memory Allocation in Python (with support for Numpy arrays)

的信息:

free -t
             total       used       free     shared    buffers     cached
Mem:          5839       5724        114          0         15       1011
-/+ buffers/cache:       4698       1141
Swap:         1021        186        835
Total:        6861       5910        950


top | grep python 

 3164 root      20   0 68748  31m 1404 R   17  0.5  53:43.89 python                                                                     
 6716 baddc0re  20   0 84788  30m 1692 S    0  0.5   0:06.81 python     

 ps aux | grep python

root      3164 57.1  0.4  64876 29824 pts/0    R+   May27  54:23 python SE_doc_parse.py
baddc0re  6693  0.0  0.2  53240 16224 pts/1    S+   00:46   0:00 python index.py

uptime

01:02:40 up  1:43,  3 users,  load average: 1.22, 1.46, 1.39


sysctl vm.min_free_kbytes

vm.min_free_kbytes = 67584

真正的问题是,当我启动脚本时,索引很快,但是当使用量增加时,它会变慢。

Document wikidoc_18784 added on 2012-05-28 01:03:46 "fast"
wikidoc_18784
-----------------------------------
Document wikidoc_21934 added on 2012-05-28 01:04:00 "slower"
wikidoc_21934
-----------------------------------
Document wikidoc_22903 added on 2012-05-28 01:04:01 "slower"
wikidoc_22903
-----------------------------------
Document wikidoc_20274 added on 2012-05-28 01:04:10 "slower"
wikidoc_20274
-----------------------------------
Document wikidoc_23013 added on 2012-05-28 01:04:53  "even more slower"
wikidoc_23013

文档大小最多为一页或两页文本。索引10页大约需要2-3秒。

Tnx大家的帮助:)

3 个答案:

答案 0 :(得分:3)

您的问题可能与内存使用过多无关。系统使用的内存越多,更快就会运行。这就是为什么我们内存添加到系统以提高其性能的原因。如果您认为使用较少的内存会以某种方式使系统更快,请记住一些内存。这将迫使它使用更少的内存。但是,毫不奇怪,如果你这样做会慢一些。

系统保持内存使用,因为它需要花费精力才能使内存空闲。并没有任何好处,因为免费记忆不起作用。这不像你今天使用的那么多,你明天可以使用两倍。如果系统需要内存,它可以很容易地直接将内存从一个用户移动到另一个用户 - 它不需要大量的内存空闲。

现代操作系统只保留少量内存,以应对某些类型的异常情况,即无法将内存从一个用户转移到另一个用户。在Linux上,您可以使用此命令查看系统需要多少可用内存:sysctl vm.min_free_kbytes。你可能会发现你大约有多少可用内存 - 这很好,因为这就是系统所需要的。

所以你不需要或想要释放记忆。你想弄清楚为什么你的系统很慢。

更新:从您的新信息来看,SE_doc_parse.py似乎正在猛烈抨击CPU。如果可能的话,我会考虑优化代码。

更新:似乎这是一种效率低下的字典算法,其使用的大小超出了它要扩展到CPU的范围。

答案 1 :(得分:3)

从讨论开始,你似乎只是将数据存储在一个巨大的字典中(通常我不会直截了当地说出来);) 也许将数据偏移到正确的数据库(如redis)可能会减少python的内存使用量。它还可以使您的数据更高效,更快速地使用。

答案 2 :(得分:1)

我猜你的程序会因为至少下列原因之一而减慢:

  • 您的内存开始交换,数据从RAM传输到磁盘,反之亦然。解决方案确实是您的程序使用更少的内存。
  • 您使用的算法会严重缩放数据大小。在这种情况下,找到更好的算法显然是解决方案。

在这两种情况下,为了提供更具体的解决方案,我们需要查看您的一些代码(它基本上是什么)。

常见解决方案包括

  • 使用Python的del来表示不再需要变量。
  • 使用迭代器而不是列表(迭代器不会占用太多内存)。