我有数千个文件。我的目标是将这些文件的行插入哈希(这些行中的大量重复)。
现在,我遍历文件上的数组,并为每个文件打开它并拆分行(因为每一行的格式如下:<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收集。要完成的第一个将写入文件,而另一个将读取从中。有可能实现吗?会减少运行时间吗?
答案 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