Как отключить историю в модуле механизации python?

У меня есть веб-скребок script, который получает новые данные раз в минуту, но в течение пары дней script заканчивается использованием 200 МБ или более памяти, и я узнал об этом, потому что механизация сохраняя бесконечную историю браузера для функции .back() для использования.

Я посмотрел в docstrings, и я нашел функцию clear_history() класса браузера, и каждый раз, когда я обновляюсь, я вызываю это, но я все равно получаю более 2-3 МБ памяти на каждом обновлении страницы. edit: Хм, похоже, что он продолжал делать то же самое после того, как я вызвал clear_history, пока не доберусь до использования памяти на 30 мегабайт, тогда он очистится до 10 мб или около того (это базовый объем памяти, который запускает моя программа)... любым способом заставить это поведение на более регулярной основе?

Как мне сохранить механизацию от хранения всей этой информации? Мне не нужно ничего хранить. Я бы хотел оставить мой python script ниже использования памяти 15 МБ.

Ответ 1

Вы можете передать аргумент history=whatever, когда вы создаете экземпляр Browser; значение по умолчанию None, что означает, что браузер фактически создает класс History (чтобы разрешить back и reload). Самый простой подход (даст исключение ошибки атрибута, если вы когда-либо переводите или перезагружаете):

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

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

более чистый подход будет реализовывать другие методы в NoHistory, чтобы дать более четкие исключения при ошибочном использовании браузера back или reload, но этого простого должно быть достаточно.

Обратите внимание, что это изящное (хотя и недостаточно хорошо документированное;) использование шаблона проектирования инъекций зависимостей: в мире (bleah) "monkeypatching", ожидается, что клиентский код перезапишет b._history после того, как браузер будет экземпляр, но с инъекцией зависимостей вы просто проходите в "историческом" объекте, который вы хотите. Я часто утверждал, что Dependency Injection может быть самым важным DP, которого не было в книге "банда 4"!).