10

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

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

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

4

1 回答 1

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())

一种更简洁的方法将实现其他方法,NoHistory以在错误使用浏览器的情况下给出更清晰的例外情况backor reload,但这个简单的方法应该就足够了。

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

于 2010-03-06T17:29:05.867 回答