【发布时间】: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 嘿,我看到了答案,他们帮了我很多,但我的工程师建议我并行执行,因为它应该很快。我正在尝试对其进行测试,然后决定哪种实现更好。
-
请查看我对问题的编辑。