【问题标题】:Reading lines of a file into a hash parallel in Perl在 Perl 中将文件的行读入并行的哈希中
【发布时间】:2019-05-10 17:41:51
【问题描述】:

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

编辑:也许我不明白这个模块到底是做什么的。我想在脚本中创建一个分支,这样一半的文件将由进程 1 收集,另一半将由进程 2 收集。第一个完成的文件将写入文件,另一个文件将读取从中。是否可以实施?它会减少运行时间吗?

【问题讨论】:

  • 我认为并行读取文件不会获得更多的磁盘IO。另请参阅您之前的问题 stackoverflow.com/questions/53691911/… ,其中有答案。另外,不要逐行阅读文件,而是批量阅读(请参阅您之前的问题)。
  • @Corion 嘿,我看到了答案,他们帮了我很多,但我的工程师建议我并行执行,因为它应该很快。我正在尝试对其进行测试,然后决定哪种实现更好。
  • 请查看我对问题的编辑。

标签: perl hash


【解决方案1】:

试试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

【讨论】:

    猜你喜欢
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2011-11-22
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多