我想让我的 Perl 程序使用多核。它逐步读取查询输入,并将其中的 block 与每次运行时从文件加载到内存中的只读数据结构进行比较。该数据结构通常为几千兆字节,是一小组用于小型 C 例程的打包字符串。当进程 fork 时,所有内容都会被复制,这在多核机器上会迅速耗尽 RAM。我尝试了几个非标准模块,但都导致运行缓慢和/或损坏 RAM。我认为,对于只读数据,Perl 不会坚持制作副本。其他语言可以做到。有人有想法吗?
最佳答案
Fork 通常不会复制内存,直到它被修改(搜索写时复制或 COW)。您确定您正在正确测量内存使用情况吗?从 free 中减去之前/之后的值,而不是使用 top。
编辑 - 示例脚本
尝试使用以下设置运行以下命令: ./fork_mem_usage 5 10000 ./fork_mem_usage 25 10000 ./fork_mem_usage 5 100000 ./fork_mem_usage 25 100000
如果第一个增量大于后续增量,则 fork 使用写时复制。几乎可以肯定是(当然 Windows 除外)。
#!/usr/bin/perl
use strict;
use warnings;
my $num_kids = shift @ARGV;
my $arr_size = shift @ARGV;
print "$num_kids x $arr_size\n";
my @big_array = ('abcdefg') x $arr_size;
die "Array wrong length" unless ($arr_size == @big_array);
print_mem_usage('Start');
for my $i (1..$num_kids) {
my $pid = fork();
if ($pid) {
if ($i % 5 == 0) {
print_mem_usage($i);
}
}
else {
sleep(5);
exit;
}
}
print_mem_usage('End');
exit;
sub print_mem_usage {
my $msg = shift;
print "$msg: ";
system q(free -m | grep buffers/cache | awk '{print $3}');
}
关于perl - Perl 进程之间共享只读内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12710258/