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

Python 内存使用情况,如何释放内存,python,memory,memory-management,memory-leaks,Python,Memory,Memory Management,Memory Leaks,我使用的是python,在为文档(搜索引擎)编制索引时需要大量的内存,在我停止索引过程后,内存仍然是满的(比如8gb的内存)。这是不好的,因为我需要我的搜索引擎一直工作,而不是在我完成索引时重置操作系统。有没有有效的方法来管理庞大的数组、字典和列表,以及如何释放它们。有什么想法吗 我在stackoverflow上也看到了一些关于它的问题,但它们都是老问题: 信息: 真正的问题是,当我启动脚本时,索引速度很快,但当使用率增加时,索引速度会变慢 Document wikidoc_18784 ad

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

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

信息:

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

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秒


谢谢大家的帮助:)

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

系统保持内存在使用中,因为它需要努力释放内存。这并没有什么好处,因为空闲内存没有任何作用。这并不是说如果你今天用了一半,明天就可以用两倍。如果系统需要内存,它可以很容易地将内存直接从一个用途移动到另一个用途——它不需要大量的空闲内存

现代操作系统只能保留少量内存,以应对某些特殊情况,即无法将内存从一种用途转换到另一种用途。在Linux上,您可以通过以下命令了解系统需要多少可用内存:
sysctl vm.min\u free\u kbytes
。您可能会发现这大概就是您拥有的可用内存量——这很好,因为这正是系统所需要的

因此,您不需要或不想释放内存。您想找出系统运行缓慢的原因

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


更新:似乎这是一个低效的字典算法,其使用的大小超出了预期的范围,占用了CPU。

我猜您的程序会减慢,因为至少有以下一个原因:

  • 内存开始交换,数据从RAM到磁盘,反之亦然。解决方案确实是,您的程序使用更少的内存
  • 您使用的算法会严重影响数据大小。在这种情况下,找到更好的算法显然是解决办法
在这两种情况下,我们都需要查看您的一些代码(它本质上是什么),以便提供更具体的解决方案

常见的解决方案包括

  • 使用Python的
    del
    ,以指示不再需要变量
  • 使用迭代器而不是列表(迭代器不使用太多内存)

从讨论中可以看出,您似乎只将数据存储在一个巨大的dict中(我很少直截了当地这么说;)
也许将数据偏移到适当的数据库(如redis)可以减少python的内存使用。它还可能使您的数据更高效,处理起来更快。

您忘了说明问题所在。如果不重置操作系统会发生什么?有东西坠毁了吗?还是慢跑?还是什么?一切都很慢。搜索引擎的性能决定了。你需要描述一下这个问题。没有人阅读你的问题会有任何线索,这是一个搜索引擎性能问题。索引完成后,什么仍然很慢?只是Python还是整个系统?当CPU运行缓慢时,它大部分是空闲的吗?什么操作系统?系统内存统计数据是什么样子的?我写过“索引文档(搜索引擎)”,我说整个系统速度很慢。Linux Ubuntu11.10是操作系统。好的,当系统运行缓慢时,
free
的输出是什么?正常运行时间的输出是什么?这个答案应该是限定的:交换应该包括在图片中。当内存从RAM交换到磁盘时,程序的运行速度确实较慢。“系统使用的内存越多,运行的速度就越快”,这一点很重要。@EOL:交换也不例外。系统使用的物理内存越多,交换的内存就越少。即使在系统交换时,使用的物理内存越多,运行速度也越快。没错,但原始海报可能考虑的是他的程序使用的内存,而不是他的计算机上可用的内存,因此您的评论可以理解为“程序使用的物理内存越多,交换的内存越少”。诚然,你的评论在技术上是正确的,但是直接解决原始海报的问题而不是对计算机的RAM做旁敲侧击会让人不那么困惑。@EOL:他说,“在我停止索引过程后,内存仍然是满的”。这怎么可能与他的程序使用的内存有关?“程序使用的物理内存越多,交换的内存就越少”是正确的。在其他条件相同的情况下,如果您强制程序使用更少的物理内存,它将交换更多的内存。(测试它。取出物理内存,迫使程序使用更少的内存,看看性能会发生什么变化。)物理内存使用良好。如果你的系统中有内存(他也有),那么使用它是免费的。虽然我在技术层面上同意你的观点,但你肯定明白“从计算机中取出内存”远不如“编写程序以减少内存占用”。我认为大多数读者会希望你讨论第二种意义,而不是第一种意义(包括原始海报,他需要的是问题的解决方案,而不是理论讨论)
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