【问题标题】:memory usage, how to free memory内存使用情况,如何释放内存
【发布时间】:2012-06-02 15:34:47
【问题描述】:

我正在使用 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秒。

请大家帮忙 :)

【问题讨论】:

  • 你忘了说是什么问题。如果您不重置操作系统会发生什么?有什么崩溃吗?还是慢跑?还是什么?
  • 一切都很慢。搜索引擎的性能法令。
  • 那么你需要描述一下这个问题。没有人阅读您的问题会知道这是搜索引擎性能问题。索引完成后仍然缓慢的是什么?只是 Python 还是整个系统? CPU 在运行缓慢时是否大部分处于空闲状态?什么操作系统?系统内存统计数据是什么样的?
  • 我写了“索引文档(用于搜索引擎)”,我说整个系统很慢。 Linux ubuntu 11.10 是操作系统。
  • 好了,系统慢的时候,free的输出是什么? uptime 的输出是什么?

标签: python memory memory-management memory-leaks


【解决方案1】:

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

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

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

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

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

更新:似乎它是一种效率低下的字典算法,用于超出其预期规模并占用 CPU 的大小。

【讨论】:

  • 这个答案应该是合格的:交换应该包含在图片中。当内存从 RAM 交换到磁盘时,程序运行速度会变慢。限定“系统使用的内存越多,运行速度越快”这一点很重要。
  • @EOL:交换也不例外。系统使用的物理内存越多,交换的次数就越少。即使系统正在交换,使用的物理内存越多,运行速度就越快。
  • 是的,但是原发帖人可以说是在考虑他的程序使用的内存,而不是他计算机上可用的内存,所以你的评论可以理解为“更多程序使用的物理内存,它交换的越少”。诚然,您的评论在技术上是正确的,但直接解决原始发帖人的担忧而不是对计算机的 RAM 进行附带评论会更容易混淆。
  • @EOL:他说,“在我停止索引过程之后,内存仍然是满的”。这怎么可能与他的程序使用的内存有关?并且“程序使用的物理内存越多,它交换的越少”是正确。在所有其他条件相同的情况下,如果您强制程序使用更少的物理内存,它将交换更多。 (测试一下。取出物理内存,强制程序使用更少,看看性能会发生什么变化。)物理内存使用。如果您的系统中有内存(他确实有),那么使用它是免费
  • 虽然我在技术层面上同意您的观点,但您当然明白“从计算机中取出内存”比“编写程序以减少内存占用”要少得多。我认为大多数读者会希望您讨论第二个含义而不是第一个含义(包括原始发帖人,他需要解决他的问题,而不是对他永远不会做的事情进行理论讨论——从他的电脑)。
【解决方案2】:

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

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

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

常见的解决方案包括

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

【讨论】:

  • 他发布了他的统计数据。他的缓存大小大大超过了他使用的交换空间。他的系统没有交换。 (很可能它只是换掉了自系统启动以来从未使用过的数据。)
  • 您对del 的看法可能是对的。内存泄漏,即使它没有用完系统的内存(在这种情况下不会),也会破坏代码的内存效率,因为它的工作集不适合缓存。这可能会导致 CPU 使用率过高。
  • @DavidSchwartz:我明白你在说什么,关于缓存与已用交换空间。但是,尚不清楚何时获得free -t 的结果。也许是在程序运行之后而不是在某些交换时间期间??
  • 如果是在程序运行之后,那么它表明程序本身并没有使用大量内存,因为程序使用的内存可能仍然是空闲的,因为系统没有让它缓存了。 (另外,首先做出最不可能的假设是没有帮助的。当你听到蹄印时,开始假设它是马,而不是斑马。至少在你看到一些相反的证据之前。)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2014-08-16
    • 1970-01-01
    相关资源
    最近更新 更多