gpt4 book ai didi

perl - 使用 Parallel::ForkManager 处理文件

转载 作者:行者123 更新时间:2023-12-03 09:19:43 25 4
gpt4 key购买 nike

我想知道使用 Parallel::ForkManager (或其他并行化工具)来处理我拥有的一些文件是否是一个好主意。基本上,我正在处理一个非常大的文件,并将其内容输出到多个文件中。在 64 核服务器中,这通常需要大约 3 小时。

我想知道这个模块的实现是如何收集数据的。例如,如果我这样做

use Parallel::ForkManager;
# Max 30 processes
my $pm = new Parallel::ForkManager(64);

open my $in,"<","D:\myfile.txt";
my @data=<$in>;
close $in;

#gathers unique dataheaders
my @uniqueheaders;
foreach my $line (@data){
my @split=split "\t",$line;
push @uniqueheaders,$split[0] unless (grep{$_=~/$split[0]} @uniqueheaders);
}

foreach my $head (@uniqueheaders) {
$pm->start and next; # do the fork

(my @matches) = grep{$_=~/^$head\t/} @data; #finds all matches in @data started by $head
if($#matches>1){ #prints out if matches are found
open my $out,">",'D:\directory\'."$head".'data';
print $out @matches;
close $out;
}
else{ print "Problem in $head!\n";}

$pm->finish; # do the exit in the child process
}
$pm->wait_all_children;

现在,我的问题是:

  1. 您认为制作这样的脚本有什么问题吗?每个 $head 是否会一次分配给一个核心,还是我必须注意其他我不知道的事情?
  2. 如果我想处理整个数据并输出一次怎么办?例如,在最后一个 foreach 循环之前创建一个数组 @gatherstuff,它不会打印,而是推送 @gatherstuff ,@matches;。这真的像我做的那么简单吗?

最佳答案

使用Parallel::ForkManager仅当您预处理文件以确定分配给每个工作人员的范围时,使用单个输入文件可能最终才有意义。而且,只有当您要使用相同的输入多次重复该工作时,这才有意义。

即使您可能从使用 Parallel::ForkManager 中获得一些好处,但让 30 个进程尝试执行 IO 也不会给您带来任何好处。如果系统不做任何其他事情(假设您有大量内存),我建议最多使用两倍的核心数量。

操作系统的缓存可能会导致不同的进程在初始预热后实际从内存中读取文件,并且 lead to gains from having multiple processes do the processing .

由于多种原因,写入不太可能从多个进程中受益。进程会从整个内存空间进行读取,进程必须等待缓冲区刷新到磁盘等等。在这种情况下,IO 瓶颈肯定会更加突出。

关于perl - 使用 Parallel::ForkManager 处理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33834665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com