Practice of Programming

プログラム とか Linuxとかの話題

巨大なファイルをgetする場合のLWP::UserAgentとFurlの場合

バッチ処理がやたらメモリくってると思ったら、なんかおっきいファイルをgetしてたせいでした orz
一旦ファイルに吐き出して、後でopenして使いたいような場合は、LWPでは、

my $ua = LWP::UserAgent->new();
$ua->get('http://example.com/big_file.gz', ':content_file' => '/path/to/big_file.gz');

Furlの場合、write_fileオプションを使います。こちらはファイルハンドル。

my $f = Furl->new();
open my $fh, '>', $filename;
$f->request(url => 'http://example.com/big_file.gz', write_file => $fh);

Furl::HTTPのドキュメントにあるけど、Furlのドキュメントから抜けてる?
# ファイルに書くなら、curl/wgetでいいよねっていう話もある。


ちなみに、gzipされたファイルを読み出したりするのは、PerlIO::via::gzip とか使える。
http://search.cpan.org/~majensen/PerlIO-via-gzip-0.021/lib/PerlIO/via/gzip.pm
# 別に、gunzipしたらいいよねっていう話もある。


ちなみに、読みつつ処理するのは、LWP::UsearAgentだと、:content_cb。Furlだと、write_code。

LWP::UserAgentの例は以下で。
http://blog.livedoor.jp/dankogai/archives/51141631.html
Furlのドキュメントにはプログレスバーの例が載ってます。
http://search.cpan.org/~tokuhirom/Furl-0.37/lib/Furl.pm#FAQ