WWW::Mechanize のメモリ消費量について

WWW::Mechanizeは、通常の利用範囲ならば、メモリ消費量について問題にはならないと思う。
しかし、一回の実行で、数千回以上の URL アクセスを繰り返すようならば、WWW::Mechanize のメモリ消費量を考慮すべきである。考慮しないと、そのうちに Out of Memory エラーが発生して、異常終了してしまうからだ。

WWW::Mechanize でメモリ消費量が増加する理由

それは、WWW::Mechanize はアクセスした URL の接続履歴をずっと残す初期設定があるからだ。履歴をどれだけ残すかどうかの設定があるので、要件に応じて残す履歴の件数を制限するとよい。

WWW::Mechanize の初期設定

$mech->stack_depth($max_depth)
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.

http://search.cpan.org/dist/WWW-Mechanize/lib/WWW/Mechanize.pm#$mech-%3Estack_depth%28_$max_depth_%29

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 のように搭載メモリが少ない環境で実行した際にエラーが出て気がついた。