我在大型运行时脚本中遇到问题。该脚本是一个多线程环境,用于执行爬取任务。
在大型执行中,脚本的内存消耗变得巨大,在使用 guppy hpy 分析内存后,我发现大部分问题都来自字符串。
我没有存储这么多的字符串:只需将 html 的内容放入内存,然后将它们存储在 db 中。在它之后,不再使用字符串(包含它的变量被分配给下一个字符串)。
出现问题是因为我看到每个新字符串(使用 sys.getrefcount)至少有 2 个引用(1 个来自我的 var,1 个来自内部)。似乎将另一个值重新分配给我的 var 并不会删除内部引用,因此字符串仍保留在内存中。
我能做些什么来确保字符串被垃圾收集?
先感谢您
编辑:
1-我正在使用 Django ORM
2-我从 2 个来源获得所有这些字符串:
2.1- 直接来自套接字 (urllib2.urlopen(url).read())
2.2- 解析响应,并从每个 html 和馈送系统中提取新的 URI
解决了
终于,我拿到了钥匙。该脚本是 Django 环境的一部分,似乎 Django 的地下正在做一些缓存或类似的事情。我关闭了调试,一切都开始按预期工作(重用的标识符似乎删除了对旧对象的引用,并且这些对象被 gc 收集)。
对于在 python 上使用某种框架层的任何人,请注意配置:似乎一些具有密集过程的调试配置会导致内存泄漏