2012-07-06 111 views
1

所以我使用DBM::Deep共享不同的分叉進程之間的數據。我建立了我的DBM ::深對象是這樣的:DBM ::深不明原因的錯誤

my $todo = DBM::Deep->new(
    file  => "urls.db", 
    locking => 1, 
    autoflush => 1, 
    type  => DBM::Deep->TYPE_HASH 
); 

但是當我運行我的腳本我似乎得到這些錯誤:

DBM::Deep: Cannot read sector at 673 in get_bucket_list() at new_forked_crawl.pl line 116 
DBM::Deep: '30': Don't know what to do with type '' at new_forked_crawl.pl line 116 
DBM::Deep: Cannot read sector at 1188 in get_bucket_list() at new_forked_crawl.pl line 116 
DBM::Deep: '65536': Don't know what to do with type '' at new_forked_crawl.pl line 116 
Can't locate object method "data" via package "DBM::Deep::Sector::File::BucketList" at /usr/lib/perl5/site_perl/5.8.8/DBM/Deep/Engine/File.pm line 160. 

所以所有,但最後一個錯誤與線做116,但什麼是如此離奇的是,線116實際上已經無關,與DBM ::深:

my $pid = fork(); 
    if($pid) { #line 116 
     push(@forked_children,$pid); 
    } 
    #child process, do the work, son! 
    elsif($pid == 0) { 
     process_url($todo->{1}->{'urls_hash'}->{$url_id}{'url'},$url_id); 
    } #end $pid else 

所以我知道這是不是很多去,但一直沒有人遇到這些錯誤或一些類似這樣?在使用DBM :: Deep方面,我是否缺少某些東西?謝謝!

回答

4

我懷疑問題源於使用DBM :: Deep對象的副本。嘗試在子中創建一個新的DBM :: Deep對象。如果在創建子項時父類中不存在這樣的對象,通常會更好。

+0

哇,很好的電話。你是怎麼推論的? – srchulo 2012-07-06 20:51:09

+1

使用文件句柄克隆對象是一個常見問題。 – ikegami 2012-07-06 21:43:23