【发布时间】:2013-02-15 20:49:14
【问题描述】:
我在大型运行时脚本中遇到问题。该脚本是一个多线程环境,用于执行爬取任务。
在大型执行中,脚本的内存消耗变得巨大,在使用 guppy hpy 分析内存后,我发现大部分问题都来自字符串。
我没有存储这么多的字符串:只需将 html 的内容放入内存,然后将它们存储在 db 中。在它之后,不再使用字符串(包含它的变量被分配给下一个字符串)。
问题出现是因为我看到每个新字符串(使用 sys.getrefcount)至少有 2 个引用(1 个来自我的 var,1 个来自内部)。似乎将另一个值重新分配给我的 var 并不会删除内部引用,因此字符串仍然在内存中。
我可以做些什么来确保字符串被垃圾回收?
提前谢谢你
编辑:
1- 我正在使用 Django ORM
2- 我从 2 个来源获取所有这些字符串:
2.1- 直接从socket (urllib2.urlopen(url).read())
2.2- 解析响应,并从每个 html 中提取新的 URI,并提供系统
已解决
终于,我拿到了钥匙。该脚本是 Django 环境的一部分,似乎 Django 的地下正在做一些缓存或类似的事情。我关闭了调试,一切都开始按预期工作(重用的标识符似乎删除了对旧对象的引用,并且这些对象被 gc 收集)。
对于任何在 python 上使用某种框架层的人,请注意配置:似乎一些具有密集过程的调试配置可能会导致内存泄漏
【问题讨论】:
-
你试过 del(my_str_var) 吗?
-
如果
sys.getrefcount返回2,则没有内部引用,因为当你将对象传递给sys.getrefcount时。它会增加引用计数。 -
我只是将新字符串分配给旧变量。显然我信任pythons的垃圾收集器,但似乎还不够。将尝试在每个字符串调用中添加一个“del”
-
just get content of htmls into memory实际 问题在哪里。 -
只需将 html 的内容放入内存 不是我的问题。我从 obj1.var1 = urllib2.urlopen(url).read() 得到 1 个 HTML,然后处理 obj1,然后是 del(obj1);在这一步之后,我处理下一个,重新分配给一个新对象 obj2
标签: python string garbage-collection