我需要模拟一个需要大量内存的进程。例如,在具有4.0 GiB的机器上,我需要一个吃3.2 GiB(给予或少量MiB)的过程。
我认为它应该像以下一样简单:
my $mbytes = 3276;
my $huge_string = 'X' x ($mbytes * 1024 * 1024);
但最终我的进程吃了两倍于我需要的内存。
在两台Windows 7 amd64机器上也是如此:一台是64位,另一台是64位 使用32位版本的Strawberry Perl
我正在使用Sysinternals Process Explorer并观看“私人字节”
当然,我可以$mbytes /= 2
(现在,我可能会这样做),但是:
有更好的方法吗?
有谁可以解释为什么金额是字符串长度的两倍?
答案 0 :(得分:6)
代码改编自http://www.perlmonks.org/index.pl?node_id=948181,所有赠予的费用均归Perlmonk BrowserUk所有。
my $huge_string = 'X';
$huge_string x= $mbytes * 1024 * 1024;
为什么金额是字符串长度的两倍?
考虑评估的顺序。右侧表达式为您的x
表达式分配内存,对新标量的赋值操作也是如此。像往常一样,即使右手表达式不再被引用,内存也不会立即被释放。
对现有标量进行操作可避免第二次分配,如上所示。