Perl进程之间共享的只读内存

Nie*_*sen 8 memory perl shared process readonly

我希望让我的Perl程序使用多个核心.它逐步读取查询输入,并将其中的块与每个运行的从文件加载的只读数据结构进行比较.该数据结构通常是几千兆字节,是一小组压缩字符串,用于小型C例程.当进程被分叉时,所有内容都被复制,这在多核计算机上快速打开RAM.我尝试了几个非标准模块,但都会导致速度变慢和/或破坏RAM.我认为,对于只读数据,Perl不会坚持要复制.其他语言可以做到.有人有想法吗?

amo*_*mon 0

编辑与总结:

threads::shared我对于成为一个选择的看法是非常错误的。创建线程时,甚至共享数据结构也会被复制。这确实很糟糕,因此我可以总结说 Perl 完全无法进行内存密集型计算。


当进程forks 时,内核会复制整个进程。RAM 中驻留的所有内容都会被复制。没有语言可以解决这个问题。不过,您可以尝试内存映射,或者可以使用线程。

Perl 线程是一种fork模拟,但您可以将变量声明为在线程之间共享:

use threads;
use threads::shared;

my $sharedVariable :shared = 0;

my @worker;

for my $i (1 .. 6) {
   push @worker, threads->create(\&worker_sub);
}

$_->join() foreach @worker;

sub worker_sub {
   sleep rand 5;
   print $sharedVariable, "\n";
}
Run Code Online (Sandbox Code Playgroud)

如果$sharedVariable在一个线程中更新,则更改也会传播到其他线程。如果将 print 语句替换为

print threads->tid, "-->", ++$sharedVariable, "\n";
Run Code Online (Sandbox Code Playgroud)