• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Perl 速度について)

Perlでサイト情報取得時の速度向上方法

このQ&Aのポイント
  • Perlを使用してサイトの情報を取得する際に、正規表現を使った一部抜粋と保存が遅くなっている問題があります。
  • 保存するデータの容量は1個あたり平均8kbで、約300ページの情報を読み込んでいます。
  • この問題を解決するためには、以下のような方法があります。 1. 正規表現の処理を最適化する 2. データの保存方法を見直す 3. コンピュータのスペックを改善する

質問者が選んだベストアンサー

  • ベストアンサー
  • hok212
  • ベストアンサー率66% (100/150)
回答No.3

やっぱり、LWP を使って http 通信を行っているのですね。 おそらくはhttp通信の応答時間が10分という時間がかかる原因でしょう。 私も以前(15年ほど前)に、ほぼ同じような仕組みを作ったことがあります。 そのときは LWP::UserAgent ではなく、get だけでよかったので LWP::Simpleを使いました。 確か30ページ程度を取得し、得られた内容から任意の値をファイルに書き込むスクリプトだったのですが、15秒~20秒程度で完走したように記憶しています。 [注意] 対象サーバによっては、getだけの用途でもLWP::Simpleが使えない場合があります。 get だけで良い and 対象サーバが応答してくれれば、 LWP::Simple を使うのも手と思います。 さらに、最近では Furl というモジュールもあるようです。 http://search.cpan.org/~tokuhirom/Furl-3.13/lib/Furl.pm 私は使ったことがありませんが、LWP との比較で2.5倍程度高速らしいです。(ローカルでの検証)

bakanandesu
質問者

お礼

お返事が遅くなり申し訳ないです。 色々試してみておりました。 Simpleは、実行できませんでした・・・ Fullもインストールしてとの指示でインストールしたのですが、 使用できませんでした。 もう少し自分で調べてみます。 また、わからないことがあったらよろしくお願いいたします。

その他の回答 (2)

  • Wap58
  • ベストアンサー率33% (29/87)
回答No.2

my $words; while($content=~m[<td.*?>(.+?)</td>]gs){ my $word = $1; $word =~ s[<.+?>|\n|\r][]g; # 文字コードeucで\rあるの? $word =~ s[(201[0-6])/][\n$1/]g; $words .= "$word," if $word; # 出来るだけ関数使わない } $words =~ s[,$][\n]; Encode::from_to($words,'euc-jp','utf8');

bakanandesu
質問者

お礼

ありがとうございます。 極力関数は使わないよう、考えてみます・・・

  • hok212
  • ベストアンサー率66% (100/150)
回答No.1

こんばんわ。 一部、何をやりたいのか良くわからない箇所もありますが、文字コードのエンコードとデコード部分を while ループの外に置くと少しは速度改善します。 @Word = join(',', @words) . "\n"; この部分ですが、join(',', @words) で得られる値は文字列ですので、次のように置き換えます。 $string = join(',', @words) . "\n"; その後で、エンコード・デコードを行えば良いです。 from_to($string,"euc-jp","utf8"); utf8::decode($string); 当然、ファイルに書き込む際は次のようになります。 print FILE $string; ですが、ボトルネックは示されたコード以外の部分だと思いますよ。

bakanandesu
質問者

お礼

御回答ありがとうございます。 エンコード・デコードを外にもっていくと 少し速くなりました。 >ボトルネックは示されたコード以外の部分だと思いますよ。 一応、個々にテストを行って他の箇所は遅くはなかったのですが、 組み合わせることによって、遅くなったりするのかな・・・? 強いてあげるなら、my @words; の上に、下記のソースがあります・・・ $num=3~5ほど $DATA=サイト側の暗号的なもの for( my $i=0; $i<$num; $i++ ){ our $URL = 'http://あるサイト/' . $DATA[$i] . '/'; my $proxy = new LWP::UserAgent; $proxy->agent('your own created browser name here'); $proxy->timeout(60); $req = HTTP::Request->new('GET' => $URL); my $res = $proxy->request($req); my $content = $res->content; if($res->is_success) {

関連するQ&A