如何在python mechanize模块中禁用历史记录?

Tha*_*tiK 10 python memory mechanize

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

我查看了文档字符串,并找到了浏览器类的clear_history()函数,每次刷新时都会调用它,但每次刷新页面时仍然会获得2-3mb更高的内存使用量. 编辑:嗯,好像它在我调用clear_history之后一直做同样的事情,直到我达到大约30mb的内存使用量,然后它清理回到10mb左右(这是我的程序启动的基本内存量)用...)任何方式更经常地强制这种行为?

如何保持机械化存储所有这些信息?我不需要保留它.我想保持我的python脚本低于15mb内存使用率.

Ale*_*lli 19

您可以history=whatever在实例化时传递参数Browser; 默认值是None指浏览器实际实例化History类(允许backreload).最简单的方法(如果您回调或重新加载,将提供属性错误异常):

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

b = mechanize.Browser(history=NoHistory())
Run Code Online (Sandbox Code Playgroud)

一个更简洁的方法将实施其他方法NoHistory来给出错误使用浏览器的更清晰的异常backreload,但这个简单的一个原本应该足够了.

请注意,这是一个优雅的(尽管没有详细记录;-)使用依赖注入设计模式:在(bleah)"monkeypatching"世界中,客户端代码应该b._history在浏览器实例化后覆盖,但是依赖注入你只需传入你想要使用的"历史"对象.我经常坚持认为依赖注入可能是最不重要的DP,而不是"4人帮"这本书! - ).

  • 我确信机械维护者会欢迎一个小补丁,将'NoHistory`(稍微更加丰富的版本;-)添加到他们的`_mechanize.py`模块中.然而,机械化的真正问题是文档的稀缺性 - 无论一个简单的5行类是否是代码的一部分是非常小的,相比之下你无法了解它(是否你必须写琐碎5行自己与否;-)除非仔细研究来源! (4认同)