WWW::Mechanize のメモリ消費量について
WWW::Mechanizeは、通常の利用範囲ならば、メモリ消費量について問題にはならないと思う。
しかし、一回の実行で、数千回以上の URL アクセスを繰り返すようならば、WWW::Mechanize のメモリ消費量を考慮すべきである。考慮しないと、そのうちに Out of Memory エラーが発生して、異常終了してしまうからだ。
WWW::Mechanize でメモリ消費量が増加する理由
それは、WWW::Mechanize はアクセスした URL の接続履歴をずっと残す初期設定があるからだ。履歴をどれだけ残すかどうかの設定があるので、要件に応じて残す履歴の件数を制限するとよい。
WWW::Mechanize の初期設定
$mech->stack_depth($max_depth)
http://search.cpan.org/dist/WWW-Mechanize/lib/WWW/Mechanize.pm#$mech-%3Estack_depth%28_$max_depth_%29
Get or set the page stack depth. Use this if you're doing a lot of page scraping and running out of memory.
A value of 0 means "no history at all." By default, the max stack depth is humongously large, effectively keeping all history.
WEBページのデータ構造を保持する件数を取得、もしくは設定する。もし、大量のページをスクレイピングしてメモリ不足が起きるようならば、このメソッドで設定する。
件数を「0」にする場合、「履歴は保持しない」設定になる。初期状態では、履歴の最大件数は、事実上すべての履歴を残せるように、とても大きい値が設定されている。
実際に設定する場合
設定は下記のようになる。
#!/usr/bin/env perl use strict; use warnings; ues utf8; use WWW::Mechanize; # 履歴の最大保持件数; my $max_depth = 10; my $mech = WWW::Mechanize->new; # 最大保持件数を設定する $mech->stack_depth($max_depth);
ローカルのマシンでテスト実行した際には気がつかなかったが、VPS のように搭載メモリが少ない環境で実行した際にエラーが出て気がついた。