繁体   English   中英

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

[英]memory usage, how to free memory

我正在使用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大家的帮助:)

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

该系统使内存保持使用状态,因为它会花时间释放内存。 而且没有好处,因为空闲内存不会做任何事情。 就像今天使用的一半不一样,明天使用的可能不是两倍。 如果系统需要某种用途的内存,则可以轻松地将内存从一种用途直接转移到另一种用途-它不需要大量的可用内存。

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

因此,您不需要或不想释放内存。 您想弄清楚为什么系统运行缓慢。

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

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

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

我猜您的程序速度变慢是由于至少以下原因之一:

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

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

常见的解决方案包括

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM