我在大型运行时脚本中遇到问题。该脚本是一个多线程环境,用于执行抓取任务。
在大型执行中,脚本的内存消耗变得巨大,在使用 guppy hpy 分析内存后,我发现大部分问题都是由字符串引起的。
我没有存储那么多字符串:只是将 html 内容放入内存,然后将它们存储在数据库中。之后,不再使用字符串(包含它的变量被分配给下一个字符串)。
问题的出现是因为我看到每个新字符串(带有 sys.getrefcount)至少有 2 个引用(1 个来 self 的 var,1 个内部引用)。似乎为我的 var 重新分配另一个值并没有删除内部引用,因此字符串仍然在内存中。
我该怎么做才能确保字符串被垃圾收集?
提前谢谢
编辑:
1-我正在使用 Django ORM
2-我从 2 个来源获取所有这些字符串:
2.1-直接从套接字(urllib2.urlopen(url).read())
2.2- 解析响应,并从每个 html 和馈送系统中提取新的 URI
已解决
终于,我拿到了 key 。该脚本是Django环境的一部分,似乎Django的地下正在做一些缓存或类似的事情。我关闭了调试,一切都开始按预期工作(重用的标识符似乎删除了对旧对象的引用,并且该对象被 gc 收集)。
对于任何在 python 上使用某种框架层的人,请注意配置:似乎一些具有密集进程的调试配置可能会导致内存泄漏
最佳答案
你说:
我发现每个新字符串(带有 sys.getrefcount)至少有 2 个引用
但是您仔细阅读了 getrefcount()
的说明吗? :
sys.getrefcount()
object) Return the reference count of the object. The count returned is generally one higher than you might expect, because it includes the (temporary) reference as an argument to getrefcount().
.
您应该详细解释一下您的计划。
它保存的 HTML 字符串的大小是多少?
它们是如何获得的?您确定要关闭所有文件的处理程序、所有套接字连接,......?
关于Python:如何垃圾收集字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15156264/