【问题标题】:How do I disable history in python mechanize module?如何在 python mechanize 模块中禁用历史记录?
【发布时间】:2011-01-24 11:57:13
【问题描述】:

我有一个网络抓取脚本,每分钟获取一次新数据,但在几天的时间里,该脚本最终使用了 200mb 或更多内存,我发现这是因为 mechanize 保持无限浏览器.back() 函数使用的历史记录。

我查看了文档字符串,发现了浏览器类的 clear_history() 函数,每次刷新时我都会调用它,但每次页面刷新时我仍然会增加 2-3mb 的内存使用量。 edit:嗯,在我调用 clear_history 之后,它似乎一直在做同样的事情,直到我使用了大约 30mb 的内存使用量,然后它又清理回了 10mb 左右(这是我的程序启动时使用的基本内存量)...有什么方法可以更定期地强制这种行为?

如何防止 mechanize 存储所有这些信息?我不需要保留任何东西。我想将我的 python 脚本的内存使用量保持在 15mb 以下。

【问题讨论】:

  • 好问题 - 我在线程爬虫中使用 mechanize,历史导致程序达到 1.5GB 内存...

标签: python memory mechanize


【解决方案1】:

你可以在实例化Browser时传递一个参数history=whatever;默认值为None,这意味着浏览器实际上实例化了History 类(以允许backreload)。最简单的方法(如果您确实回调或重新加载,将给出属性错误异常):

class NoHistory(object):
  def add(self, *a, **k): pass
  def clear(self): pass

b = mechanize.Browser(history=NoHistory())

一种更简洁的方法是在NoHistory 中实现其他方法,以便在错误使用浏览器的backreload 时给出更清晰的例外,但这个简单的方法应该就足够了。

请注意,这是对依赖注入设计模式的一种优雅使用(尽管没有很好的记录;-):在(无聊的)“monkeypatching”世界中,客户端代码将在浏览器运行后覆盖b._history实例化,但通过依赖注入,您只需传入您想要使用的“历史”对象。我经常坚持认为,依赖注入可能是最重要的 DP,它不在“4 人帮”一书中!-)。

【讨论】:

  • 这应该是默认机械化代码恕我直言的一部分。非常感谢 ;) 我使用 clear_history,导入 gc 模块并强制垃圾收集,以保持内存在 10 到 18mb 的内存使用量之间反弹,希望你的方法能让事情保持相对更稳定;)跨度>
  • 我相信机械化维护者会欢迎一个小补丁添加NoHistory(在一个稍微充实的版本中;-)到他们的_mechanize.py模块。然而,mechanize 的真正问题是文档的稀缺性——一个琐碎的 5 行类是否是代码的一部分,与您无法了解它的事实相比(无论您是否必须编写琐碎的5 行自己与否;-) 除非仔细研究来源!
  • 哇,亚历克斯,你刚刚启发了我。我之前听说过“monkeypatching”这个词,并试图弄清楚它。这给了我一个实际的例子,但是查看我的代码,我已经在自己做了!我的类为 cookiejar 传入一个默认的“None”,并启动它自己的,除非已经初始化并传入了另一个。非常感谢!
  • @ThantiK,不客气——是的,我并不惊讶你已经在使用依赖注入(不是猴子补丁:DI 消除对 MP 的需求! -) 不将其与其名称联系起来——知道名称仍然有帮助(更容易谈论和思考,更容易查找有关模式的文章,+s 和 -s,相关的......)。
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2011-01-28
相关资源
最近更新 更多