10

新しいデータを 1 分ごとに取得する Web スクレイピング スクリプトがありますが、数日の間に、スクリプトは 200 MB 以上のメモリを使用することになります。使用する .back() 関数。

docstring を調べたところ、ブラウザー クラスの clear_history() 関数が見つかりました。更新するたびにそれを呼び出しますが、ページを更新するたびにメモリ使用量が 2 ~ 3 MB 高くなります。 編集: うーん、clear_history を呼び出した後、約 30 MB 相当のメモリ使用量になるまで同じことを続けていたようです。まで)...この動作をより定期的に強制する方法はありますか?

mechanize がこの情報をすべて保存しないようにするにはどうすればよいですか? 私はそれを保持する必要はありません。Python スクリプトのメモリ使用量を 15 MB 以下に抑えたいと考えています。

4

1 に答える 1

19

;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場合は、この単純な方法で十分です。

これは依存性注入設計パターンの洗練された (しかし十分に文書化されていない;-) 使用法であることに注意してください: (ひどい) "モンキーパッチ" の世界では、クライアント コードはb._historyブラウザーがインスタンス化された後に上書きされることが期待されますが、依存性注入を使用します。使用したい「履歴」オブジェクトを渡すだけです。私は、依存性注入が「ギャング オブ 4」の本にはなかった最も重要な DP である可能性があると主張してきました!-)。

于 2010-03-06T17:29:05.867 に答える