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

时间:2018-12-09 18:10:28

标签: perl hash

我有数千个文件。我的目标是将这些文件的行插入哈希(这些行中的大量重复)。 现在,我遍历文件上的数组,并为每个文件打开它并拆分行(因为每一行的格式如下:<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中(如果可能,请插入两个以上的哈希)。 然后,我可以将这两个(或更多)哈希组合成一个主哈希。不应有内存问题(因为我在没有内存问题的计算机上运行)。 我阅读了去污信息,但每次尝试均失败,并且每次迭代都单独运行。我想看看应该解决此问题的初始示例。 另外,我想听听关于如何以更干净,更明智的方式实施此操作的另一种意见。

编辑:也许我不明白该模块的功能。我想在脚本中创建一个fork,这样一半的文件将被进程1收集,另一半将被进程2收集。要完成的第一个将写入文件,而另一个将读取从中。有可能实现吗?会减少运行时间吗?

1 个答案:

答案 0 :(得分: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