Python:如何垃圾收集字符串

标签 python string garbage-collection

我在大型运行时脚本中遇到问题。该脚本是一个多线程环境,用于执行抓取任务。

在大型执行中,脚本的内存消耗变得巨大,在使用 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/

相关文章:

c# - .NET 4.5 Async/Await 和垃圾收集器

python - Django 表单在刷新时再次提交

c++ - 在 C++ 中切片 char 数组(python 到 c++)

java - 丢失的字符串对象会发生什么

c - 在 C 中反转字符串时出现运行时错误

Java Unicode 字符转 UTF

java.lang.OutOfMemory错误: GC overhead limit exceeded android studio

python - Pandas 系列到 Numpy ndarray

python - 从元组创建字典,使用元组变量名称作为 Python 中的键

python - 在服务器上执行python脚本