一分一秒真剣勝負!

Ruby, Railsなど。Web系の技術ネタを充実させたい・・が、そうなるかは分からない。

WWW::Mechanizeがメモリを食いまくる件について

 Rubyで某通販サイトの商品在庫数をファイルにリスト出力するスクリプトを書いたら、なんとクロールが終了し終わった頃にはメモリを400Mも消費していた。pageオブジェクトをループするごとにクリアするとか、何かやらないと駄目なのか?とずっと悩んでいたところ、id:kitamomongaさんのブログを発見。

もしかして履歴って無限?

無限です。しかも @body 変数にファイル内容を丸まんま保持したまま延々メモリ内に積み重なっていきます。メモリの空きが無くなるか、その WWW::Mechanize オブジェクトが終了するまで続きます。

agent.max_history = 1 とすると、動作に必要な最低限の履歴が確保できます。履歴に関する機能を自力で使わないのならこれで充分だと思われます。

 なるほど、助かりました。max_historyなんてメソッドがあったのか。これで無駄にメモリを使わなくて良くなった。あと、WWW::Mechanizeの解説が素敵すぎるので後で熟読します。