2

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

我在stackoverflow上也看到了一些关于它的问题,但它们很旧:

Python 内存占用与堆大小

在 Python 中分析内存分配(支持 Numpy 数组)

信息:

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大家的帮助:)

4

3 回答 3

3

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

系统保持内存在使用中,因为它需要努力释放内存。而且没有任何好处,因为空闲内存没有任何作用。不是说今天用一半,明天就可以用两倍。如果系统需要内存来做某事,它可以轻松地将内存直接从一个用途转移到另一个用途——它不需要大量空闲的内存。

现代操作系统仅保留少量可用内存来应对某些类型的异常情况,即它们无法将内存从一种用途转移到另一种用途。在 Linux 上,您可以使用以下命令了解系统需要多少可用内存:sysctl vm.min_free_kbytes. 您可能会发现这大致就是您拥有的可用内存量——这很好,因为这正是系统所需要的。

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

更新:从您的新信息来看,它看起来像是SE_doc_parse.py在猛烈撞击 CPU。如果可能的话,我会考虑优化该代码。

更新:似乎它是一种效率低下的字典算法,用于超出其打算扩展到的大小并占用 CPU。

于 2012-05-28T08:56:04.197 回答
3

从讨论来看,您似乎只是将数据存储在一个巨大的字典中(我通常不会直面地说;))也许将数据偏移到像 redis 这样的适当数据库中可能会减少 python 的内存使用量。它还可能使您的数据更高效、更快速地使用。

于 2012-05-28T09:57:13.030 回答
1

我猜你的程序变慢了,至少有以下原因之一:

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

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

常见的解决方案包括

  • 使用 Pythondel来指示不再需要变量。
  • 使用迭代器而不是列表(迭代器不使用太多内存)。
于 2012-05-28T09:27:37.467 回答