プロが教えるわが家の防犯対策術!

前回の投稿で完全に書き間違えた部分がありそのままではよくわからないものになってしまっていたのですが、投稿し直しなどができなかったので再度投稿させてもらいます。

プログラムは
use Web::Scraper;
use WWW::Mechanize::Firefox;
use Parallel::ForkManager;
use URI;
binmode STDOUT,":utf8";
sub func ;

($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime();
$year += 1900 ;
$mon += 1 ;

$File = "yuma-$year:$mon:$mday:$hour.txt" ;
open (file,"> $File") or die 'fail to open file\n';

print "HOW MUCH PAGE\n" ;
my $page = <STDIN> ;

print "WITEING...\n" ;
my $MAX_PROCESSES = 5;
my $pm = new Parallel::ForkManager($MAX_PROCESSES);
for ($i = 1;$i <= $page;$i++) {
$pm->start and next;

my $uri = URI -> new ("www.目的とするURL$i.html");
my $mech = WWW::Mechanize::Firefox->new();
$mech->get($uri) ;
print file $s->scrape($mech->content) ;
print file "\n" ;
print file $r->scrape($mech->content) ;
print file "\n" ;

$pm->finish;
}
print "WITEID\n" ;

my $s = scraper {
process 'font',sen => 'TEXT';
result 'sen';
};
my $r = scraper {
process 'div#content',ren => 'TEXT';
result 'ren';
};

close (file) ;
です。
$i の順序でファイルへ書き込みをしていきたいのですが、前の処理が終わっていなかった場合に待つ方法がわからないので初心者レベルで教えてください。

A 回答 (3件)

NO.1 さんの言う通りですが、別案として。



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

この回答への補足

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

補足日時:2013/01/23 01:15
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/22 22:46

これって、単に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を使うとか。

この回答への補足

プログラムは
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
となり途中で止まり完全にバグってしまっています。

補足日時:2013/01/23 00:56
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/23 00:57

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2013/01/22 22:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!