perl - Perl 进程之间共享只读内存

标签 perl memory process shared readonly

我想让我的 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/

相关文章:

javascript - 在服务器端运行基于 Mechanize 的 Perl 脚本

php - 哪个更好,常量还是变量?

visual-c++ - 无法杀死的控制台窗口

Java Process.waitFor() 与 Process.exitValue()

arrays - 不使用 foreach 删除数组值中的一部分

perl - &$func($arg) 和 $func->($arg) 之间有什么区别吗?

python - python 有它的错误报告消息吗 $!在 perl 中

c - 尝试在模拟操作系统内存管理器中显示分配内存的 "map"

ruby - 此代码是否在 Ruby 中创建循环内存引用?

c - 无法更改进程的 gid