【问题标题】:"Out of Memory" error with mechanize机械化出现“内存不足”错误
【发布时间】:2012-03-08 00:29:28
【问题描述】:

我试图逐页从网站上抓取一些信息,基本上我是这样做的:

import mechanize
MechBrowser = mechanize.Browser()

Counter = 0

while Counter < 5000:
    Response = MechBrowser.open("http://example.com/page" + str(Counter))
    Html = Response.read()
    Response.close()

    OutputFile = open("Output.txt", "a")
    OutputFile.write(Html)
    OutputFile.close()

    Counter = Counter + 1

好吧,上面的代码最终抛出了“内存不足”错误,在任务管理器中显示脚本在运行几个小时后几乎耗尽了 1GB 内存……怎么会?!

谁能告诉我出了什么问题?

【问题讨论】:

  • 我要尝试排除的第一件事是 mechanize 正在泄漏内存 - 只需使用 urllib2.urlopen() 代替。
  • 请注意,for counter in range(5000): 更像 pythonic。 PEP8 推荐使用 lower_case_with_underscores 作为变量名,而 CamelCase 是为类保留的。此外,请查看 with 以向/从文件写入/读取。
  • (a) 这种“我的代码怎么了”的问题在 codereview 上比较好 (b) 变量重用不是问题 (c) 了解内存分析。
  • @Marcin 不,代码审查是针对 工作 代码的,这显然 not 工作,因为它会引发异常。对于代码审查来说,它是题外话

标签: python memory urllib2 mechanize


【解决方案1】:

这并不完全是内存泄漏,而是一个未记录的功能。基本上,mechanize.Browser() 将所有浏览器历史记录一起存储在内存中。

如果您在Response.close() 之后添加对MechBrowser.clear_history() 的调用,应该可以解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多