Умышленно съедая определенное количество памяти, используя скрипт Perl - PullRequest
3 голосов
/ 03 апреля 2012

Мне нужно смоделировать процесс, требующий памяти. Например, на машине с 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 Ответ

6 голосов
/ 03 апреля 2012

Код, адаптированный с http://www.perlmonks.org/index.pl?node_id=948181, Все кредиты идут на Perlmonk BrowserUk .

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

почему сумма в два раза длиннее строки?

Подумайте о порядке оценки. Правое выражение выделяет память для вашего выражения x, и опять же, как и операция присваивания в ваш новый скаляр. Как обычно для Perl, даже если на выражение правой руки больше нет ссылок, память не освобождается сразу.

Работа на существующем скаляре позволяет избежать второго распределения, как показано выше.

...