Perl - снять хеш при обработке многопоточных - PullRequest
0 голосов
/ 08 марта 2012

У меня очень большой хэш-хэш с более чем 50 000 записей. Я хочу обработать это многопоточное из-за временных ограничений.

Возможно ли для каждого вызова dequeue () возвращать следующий элемент из хеша, а не полный хеш? В приведенном ниже примере я хочу, чтобы 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"
         }
    }  
}

1 Ответ

0 голосов
/ 08 марта 2012

Но будет лучше, если вы будете использовать ссылку вместо хеша.Используйте arrefref, который содержит hashrefs.Это было бы более эффективно.

Это для вашего текущего кода.

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;

regards,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...