我正在使用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大家的帮助:)
答案 0 :(得分:3)
您的问题可能与内存使用过多无关。系统使用的内存越多,更快就会运行。这就是为什么我们将内存添加到系统以提高其性能的原因。如果您认为使用较少的内存会以某种方式使系统更快,请记住一些内存。这将迫使它使用更少的内存。但是,毫不奇怪,如果你这样做会慢一些。
系统保持内存使用,因为它需要花费精力才能使内存空闲。并没有任何好处,因为免费记忆不起作用。这不像你今天使用的那么多,你明天可以使用两倍。如果系统需要内存,它可以很容易地直接将内存从一个用户移动到另一个用户 - 它不需要大量的内存空闲。
现代操作系统只保留少量内存,以应对某些类型的异常情况,即无法将内存从一个用户转移到另一个用户。在Linux上,您可以使用此命令查看系统需要多少可用内存:sysctl vm.min_free_kbytes
。你可能会发现你大约有多少可用内存 - 这很好,因为这就是系统所需要的。
所以你不需要或想要释放记忆。你想弄清楚为什么你的系统很慢。
更新:从您的新信息来看,SE_doc_parse.py
似乎正在猛烈抨击CPU。如果可能的话,我会考虑优化代码。
更新:似乎这是一种效率低下的字典算法,其使用的大小超出了它要扩展到CPU的范围。
答案 1 :(得分:3)
从讨论开始,你似乎只是将数据存储在一个巨大的字典中(通常我不会直截了当地说出来);) 也许将数据偏移到正确的数据库(如redis)可能会减少python的内存使用量。它还可以使您的数据更高效,更快速地使用。
答案 2 :(得分:1)
我猜你的程序会因为至少下列原因之一而减慢:
在这两种情况下,为了提供更具体的解决方案,我们需要查看您的一些代码(它基本上是什么)。
常见解决方案包括
del
来表示不再需要变量。