Perl内存分配



以下简单的C代码分配了大约1.6%的计算机内存,并在不到2秒的时间内完成:

main()
{
    int i = 0;
    char *array = malloc(64000000);
    for (i = 0; i < 64000000; i++) {
        array[i] = i % 256;
    }
    getchar();
}

如何在Perl中做类似的事情?

下面的Perl代码消耗了大约70%的计算机内存(我杀死了它)

my @array;
for(my $i=0;$i<64000000;$i++)
{
    $array[$i]=1;
}
getc();
exit;

您分配了一个包含64,000,000个SV*和64,000,000个标量的数组。这个数组本身已经是你在C程序中分配的数组的8倍大了。这还不包括64,000,000个标量或分配64,000,000个内存块的开销。

要分配64,000,000字节,可以使用以下命令:

my $s = "" x 64_000_000;
然而,这将在内存中放置两个副本。[1]
use Fcntl qw( SEEK_SET );
my $s;
{
   open my $fh, '>', $s;
   seek($fh, 64_000_000-1, SEEK_SET);
   print $fh "";
}

pack + substr可用于存储数字,substr + unpack可用于提取数字。

最后,您可以使用PDL,而不是处理打包数。


    从技术上讲,它只将一个副本放入内存,并且它在编译时这样做。由于copy-on-write (COW)机制,赋值只会导致$s共享常量的缓冲区。但是,我假设你打算修改$s中的缓冲区,这将需要创建其缓冲区的可写副本。

您可以看到不同语言之间变量大小的差异。

见http://perlmaven.com/how-much-memory-do-perl-variables-use

这也很好地解释了内存使用:

http://search.cpan.org/nwclark/猛击-大小0.79/lib/猛击/Size.pm

简而言之,您的perl数组至少需要1536 MB的空间来存储该数组。

相关内容

  • 没有找到相关文章

最新更新