gpt4 book ai didi

multithreading - Parallel::ForkManager 使子例程慢 1000 倍

转载 作者:行者123 更新时间:2023-12-04 06:46:19 25 4
gpt4 key购买 nike

我有一个子例程,我已经尽可能多地连续优化它,大致像

sub overlap {

my $hash_reference = shift; # pass the hash to the subroutine
my %h = %{ $hash_reference }; # refer to the hash as %h
my $standard = shift; # this is the key that will be compared against
my $compared = shift; # this is the key being compared
my $start_index = 0; # this will continually be increased
# to save computation time

# I want to parallelize here

foreach my $s ( 0 .. scalar @{ $h{$standard}{end} }-1 ) {
foreach my $c ( $start_index .. scalar @{ $h{$compared}{end} }-1 ) {
... # abbreviated for minimal working example
}
}

return ($standard_indices_met_in_compared, \@overlay);
}

这是一个缓慢的子程序。我在大约 12-14 分钟内运行它数千次,但一次又一次地运行它会浪费时间。

我经常将 Parallel::ForkManager 用于系统进程,但这在这里效果不佳。

Parallel::ForkManager 的实现看起来像

use Parallel::ForkManager qw();
my $manager = new Parallel::ForkManager(2);
foreach my $s ( 0 .. scalar @{ $h{$standard}{end} }-1 ) {

foreach my $c ( $start_index .. scalar @{ $h{$compared}{end} }-1 ) {
$manager->start and next;
... # abbreviated for minimal working example
}

$manager->finish;
}

$manager->wait_all_children; # necessary after all lists

我看过线程等,但看不到如何在此处应用。

我看过Perl multithreading and foreach和线程的 Perl 文档,以及许多其他来源,但我不知道如何在这种情况下应用之前所做的事情。我看到的一切看起来都只是针对系统命令。

我想写入共享数组和标量,没有系统命令。如果我遗漏了什么,请告诉我。

如何在子例程中并行化此 foreach 循环?

最佳答案

您真的只尝试并行处理最多两个进程吗?如果是这样,这可能是感知缓慢的根源。

总是会有与并行化相关的开销。如果并行处理超过 10 个进程,则无法保证 10 倍的加速。

我建议你把最大进程数开到更合理的程度再试试。如果这没有帮助,可能是由于:

  • 硬件限制
  • 关于您尝试并行化的循环的某些事情会强制顺序执行(例如,写入同一文件、数据库表、更新信号量或共享变量...)

关于multithreading - Parallel::ForkManager 使子例程慢 1000 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350656/

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