首页 文章

在Perl中将文件行读入并行哈希

提问于
浏览
0

我有成千上万的文件 . 我的目标是将这些文件的行插入到哈希中(大量的这些行重复) . 现在,我遍历文件和每个文件的数组,打开它并拆分行(因为每行的格式如下: <path>,<number> ) . 然后我插入 %paths 哈希 . 我写入一个主文件的每一行(试图通过组合来节省时间) .

我的代码片段:

open(my $fh_main, '>', "$main_file") or die;
foreach my $dir (@dirs)
{
    my $test = $dir."/"."test.csv";
    open(my $fh, '<', "$test") or die;
    while (my $row = <$fh>)
    {
        print $fh_main $row;
        chomp($row);
        my ($path,$counter) = split(",",$row);
        my $abs_path = abs_path($path);
        $paths{$abs_path} += $counter;
    }
    close ($fh);
}
close ($fh_main);

由于文件很多,我想将迭代分割至少一半 . 我想使用 Parallel::ForkManager 模块(link),以便将文件并行插入哈希 A 并进入哈希 B (如果可能的话,然后是两个以上的哈希值) . 然后我可以将这两个(或更多)哈希组合成一个主哈希 . 应该没有内存问题(因为我在没有内存问题的机器上运行) . 我阅读了去污,但每次尝试都失败了,每次迭代都是单独运行的 . 我想看一个我应该解决这个问题的初步例子 . 此外,我想听听另一个关于如何以更清洁和明智的方式实现这一点的意见 .

Edit :也许我不明白模块究竟是做什么的 . 我想在脚本中创建一个fork,所以文件的一半将由进程1收集,另一半将由进程2收集 . 第一个完成将写入文件而另一个将读取从中 . 有可能实施吗?它会缩短运行时间吗?

1 回答

  • 0

    试试MCE::Map . 它会自动将子进程的输出收集到一个列表中,在您的情况下可以是一个哈希值 . 这是一些未经测试的伪代码:

    use MCE::Map qw[ mce_map ];
    
    # note that MCE passes the argument via $_, not @_
    sub process_file {
       my $file = $_;
       my %result_hash;
       ... fill hash ...
       return %result_hash
    }
    
    my %result_hash = mce_map  \&process_file \@list_of_files
    

相关问题