Умышленно съедая определенное количество памяти, используя скрипт Perl
Мне нужно смоделировать процесс, требующий памяти. Например, на машине с 4,0 ГиБ, мне нужен процесс, который будет кушать 3,2 ГиБ (дать или взять несколько МБ).
Я предположил, что это должно быть так просто, как:
my $mbytes = 3276;
my $huge_string = 'X' x ($mbytes * 1024 * 1024);
Но в итоге я получаю в два раза больше памяти, чем мне нужно.
это то же самое на двух компьютерах с Windows 7 amd64: один с 64-битной версией, другой с 32-битной сборкой Strawberry Perl
Я использую Sysinternals Process Explorer и смотрю "Private Bytes"
Конечно, я мог бы просто $mbytes /= 2
(сейчас я, вероятно, сделаю это), но:
Есть ли способ лучше?
Кто-нибудь может объяснить, почему сумма в два раза длиннее строки?
1 ответ
Код адаптирован с http://www.perlmonks.org/index.pl?node_id=948181, вся заслуга принадлежит Perlmonk BrowserUk.
my $huge_string = 'X';
$huge_string x= $mbytes * 1024 * 1024;
почему сумма в два раза больше длины строки?
Подумайте о порядке оценки. Правое выражение выделяет память для вашего x
выражение, и снова то же самое делает операция присваивания в ваш новый скаляр. Как обычно для Perl, даже если на выражение правой руки больше не ссылаются, память не освобождается сразу.
Работа на существующем скаляре позволяет избежать второго распределения, как показано выше.