• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Parallel::ForkManager(2))

複数のページからデータを取得し、ファイルに書き込む方法

このQ&Aのポイント
  • URLを指定して複数のページからデータを取得し、ファイルに書き込む方法を解説します。
  • Parallel::ForkManagerモジュールを使用して複数のプロセスで並列処理を行い、効率的にデータを取得します。
  • ファイルへの書き込みはファイルハンドルを利用し、読み込みと書き込みの競合を避けるため同時に書き込むことができます。

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

NO.1 さんの言う通りですが、別案として。 並列処理しているそれぞれのプロセスで違うファイルに出力し、子プロセスがすべて終了した後に、親プロセスでそれらのファイルを順番にくっつけるという方法はどうでしょうか。

pipopipoid
質問者

お礼

つなぐ動作はおそらくシステムの部分を呼ぶのかと考えますが、 ばらばらにつないでしまうと大きなファイルにしたときに読み取りに時間がががるのではないか、 寄せ集めて集める前の部分を消した場合HDD(の寿命)に影響が出ないかが心配です。 集めても1.2Mしか使わないので問題ないといえばないのですが・・・ すいません、パソコン関係はソフトもハードも苦手なのであまりわからないので困っていますがみんなそうするのでしょうか?

pipopipoid
質問者

補足

とりあえずこの方法で進めていってみようと思います。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

これって、単にmy $mech = WWW::Mechanize::Firefox->new(); を毎回やってるのが遅いだけでは? my $mech = WWW::Mechanize::Firefox->new(); for ($i = 1;$i <= $page;$i++) { my $uri = URI -> new ("www.目的とするURL$i.html"); $mech->get($uri) ; print file $s->scrape($mech->content) ; print file "\n" ; print file $r->scrape($mech->content) ; print file "\n" ; } にしたら十分な速度が得られたりしませんか? fiirefox通す必要が無いなら、LWPを使うとか。

pipopipoid
質問者

お礼

ありがとうございます、オブジェクト指向がよくわからないけどこれがそうなんだろうということでforkごとに仕事させるオブジェクトを作ってます。 firefoxがなければ早いのですがjavascriptが含まれているので仕方なく使っています。 回線が悪いため?firefoxでは1ページ読み取りまで大体4秒前後かかり806Pでは間に合わない結果となります。 改造を行ったプログラムが事故を起こしているので補足の方に書いておきますので誰が助けてください(..)

pipopipoid
質問者

補足

プログラムは use Web::Scraper; use WWW::Mechanize::Firefox; use URI; use Parallel::ForkManager; use utf8; my $s = scraper { process 'font',sen => 'TEXT'; result 'sen'; }; my $r = scraper { process 'div#content',ren => 'TEXT'; result 'ren'; }; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(); $year += 1900 ; $mon += 1 ; print "HOW MUCH PAGE\n" ; my $page = <STDIN> ; chomp $page ; print "YA=WITEING...\n" ; my $Max = 10 ; my $pm = new Parallel::ForkManager($Max) ; for ($i = 1;$i <= $page;$i++) { $pm->start and next; $File = "current-ya$i.txt" ; open (file2, ">:utf8","$File") or die 'fail to open file\n'; my $uri = URI -> new ("目的とするURL$i"); my $mech = WWW::Mechanize::Firefox->new(); $mech->get($uri) ; print file2 $s->scrape($mech->content) ; print file2 "\n" ; print file2 $r->scrape($mech->content) ; print file2 "\n" ; print "this page is $i\n" ; close (file2) ; $pm->finish; } wait_all_children ; print "YASASIISEKAI=NOVEL=WITEID\n" ; print "CAT...\n" ; sleep 3 ; #system ("cat current-ya* > ya=$year:$mon:$mday:$hour.txt") ; #system ("rm -r current-ya*") ; print "PERFECT\n"; この結果が ai@ubuntu:~/Documents/ya$ perl test.pl HOW MUCH PAGE 14 YASASIISEKAI=NOVEL=WITEING... this page is 10 this page is 7 this page is 9 this page is 3 this page is 8 YA=WITEID CAT... this page is 6 this page is 4 this page is 5 this page is 2 this page is 1 PERFECT ai@ubuntu:~/Documents/yasasii$ this page is 11 this page is 12 this page is 14 this page is 13 ^C となり途中で止まり完全にバグってしまっています。

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

全ての処理を順番に行うなら、Parallel(?)を使わなければいいのでは?

pipopipoid
質問者

お礼

807Pageあるため前回forkなどを使わずに実行した結果30分程度かかってしまいましたので困ってしまって多重化しようとしてます。