2012-03-08 6 views
0

私は50,000以上のエントリを持つ非常に大きなハッシュハッシュを持っています。私は時間の制約のためにこのマルチスレッドを処理したい。Perl - マルチスレッド処理時にハッシュをデキューします

dequeue()を呼び出すたびに、完全なハッシュではなく、ハッシュから次の項目を返すことは可能ですか?すべての項目が処理されるまで別のスレッドがハッシュから別の項目をデキューしながら、私のスレッドで

flintstones => { 
    old_address => "0x1231234a", 
    new_address => "0x1234234d", 
    source  => "sym" 
}, 

私がすることができ、その後のプロセス:例では、私はちょうどを返すためにデキューを()したいの下に。下の私のコード例。

問題がないストレージフォーマット(HoH)を変更する必要がある場合。多分ハッシュの配列がうまくいくでしょうか?任意のヘルプ/ポインタが高く評価されました。

use strict; 
use warnings; 

use threads; 
use Thread::Queue; 
use Data::Dumper; 

my %hoh = (
    flintstones => { 
     old_address => "0x1231234a", 
     new_address => "0x1234234d", 
     source  => "sym" 
    }, 
    jetsons => { 
     old_address => "0x12712343", 
     new_address => "0x12142344", 
     source  => "sym" 
    }, 
    simpsons => { 
     old_address => "0x12f12347", 
     new_address => "0x12a42348", 
     source  => "dwarf" 
    }, 
); 


my $href = \%hoh; 
my $queue= Thread::Queue->new($href); 

my $t = threads->create('start_sub'); 
my $result = $t->join; 

sub start_sub { 
    print "items on queue = " . $queue->pending() . "\n"; 

    while($queue->pending()) { 

     my $item = $queue->dequeue_nb(); 

     # 
     ## dequeue_nb returns undef when queue empty 
     if($item) { 

      print "Doing work in thread " . threads->tid() . " on:\n"; 

      print Dumper($item); 
      print "Done =====================\n" 
     } 
    } 
} 
+0

私は '私の$キュー=スレッド:: Queue->新しい(キー%のHOH)でこれを解決したと思います;'。基本的には、ハッシュのキーをキューにロードしてから、各スレッドは個々のアイテムで作業できます。 – Chris

答えて

0

ただし、ハッシュではなく参照を使用する方がよいでしょう。 hashrefを含むarrefrefを使用してください。それはもっと効率的です。

これはあなたの現在のコードです。

sub dequeue_nb{ 
    my $key_of_first_item = (keys %hoh)[0];#random order 
    my $item = $hoh{$key_of_first_item}; 
    delete $hoh{$key_of_first_item}; 
return $item; 

に関して、

+0

dequeue_nbはモジュールのスレッドです::キュー[リンク](http://perldoc.perl.org/Thread/Queue。 html#BASIC-METHODS)を参照してください。その機能を再定義することが私がここでやりたいことであるかどうかは分かりません... – Chris

関連する問題