3

我需要模拟一个需要大量内存的过程。例如,在一台 4.0 GiB 的机器上,我需要一个可以吃掉 3.2 GiB 的进程(给或取几个 MiB)。

我认为它应该很简单:

my $mbytes = 3276;
my $huge_string = 'X' x ($mbytes * 1024 * 1024);

但最终我的进程消耗的内存是我需要的两倍。

  • 这在两台 Windows 7 amd64 机器上是相同的:一台使用 64 位,另一台使用 32 位构建的草莓 Perl

  • 我正在使用 Sysinternals Process Explorer 并观看“Private Bytes”

当然,我可以$mbytes /= 2(现在,我可能会这样做),但是:

  • 有没有更好的办法?

  • 谁能解释为什么金额是字符串长度的两倍?

4

1 回答 1

6

改编自http://www.perlmonks.org/index.pl?node_id=948181的代码,所有功劳归于 Perlmonk BrowserUk

my $huge_string = 'X';
$huge_string x= $mbytes * 1024 * 1024;

为什么金额是字符串长度的两倍?

考虑评估的顺序。右边的表达式为您的表达式分配内存x,同样,赋值操作也为您的新标量分配内存。与 Perl 一样,即使不再引用右侧表达式,内存也不会立即释放。

如上所示,对现有标量进行操作可避免第二次分配。

于 2012-04-03T15:32:51.977 回答