gpt4 book ai didi

Perl内存分配

转载 作者:行者123 更新时间:2023-12-02 17:37:31 26 4
gpt4 key购买 nike

以下简单的 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;

我如何在 Perl 中 malloc?

最佳答案

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

要分配 64,000,000 字节,您可以使用以下方法:

my $s = "\0" 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 "\0";
}

pack+substr可以用来存储一个数,substr+unpack可以用来提取一个数字。

最后,您可以使用 PDL 而不是处理压缩数字.


  1. 从技术上讲,它只将一个副本放入内存,并且在编译时这样做。多亏了写时复制 (COW) 机制,赋值只会导致 $s 共享常量的缓冲区。但是,我假设您打算修改 $s 中的缓冲区,这需要制作其缓冲区的可写副本。

关于Perl内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25190379/

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