Вычислительная системная память, используемая в Perl

Я выполнил верхний ответ здесь, см. ниже для кода, чтобы получить системную память, используемую в данной строке в моем Perl-коде. Я использую Windows 7 Home Basic, 64-разрядную версию, 4 ГБ оперативной памяти, 4,06 ГБ виртуальной памяти (как указано в дополнительных системных настройках в разделе «Мой компьютер»). Я получил следующее сообщение от perl в строке, прежде чем perl перейдет в состояние Недостаточно памяти.

Использование памяти: 1916346368

Если предположить, что это число в байтах (= 1,78 ГБ), почему Perl вышел из памяти? Как я могу получить общее использование памяти системы всеми процессами?

Блок кода для вычисления памяти показан ниже. Я использую Strawberry Perl 5.12.3.0

use Win32::OLE qw/in/;

sub memory_usage() {
    my $objWMI = Win32::OLE->GetObject('winmgmts:\\\\.\\root\\cimv2');
    my $processes = $objWMI->ExecQuery("select * from Win32_Process where ProcessId=$$");

    foreach my $proc (in($processes)) {
        return $proc->{WorkingSetSize};
    }
}

print 'Memory usage: ', memory_usage(), "\n";

Perl -V дает следующую информацию: http://pastebin.com/mvF7YgKH

Обновление: проблема решена с помощью 64-битного Perl. Но я также заметил, что программа запускалась без проблем на 32-битном Perl на Ubuntu. Так что, возможно, Strawberry perl в Windows занимает больше памяти, чем perl в Ubuntu.


person user13107    schedule 03.11.2012    source источник
comment
Что делал Perl, когда ему не хватало памяти?   -  person Schwern    schedule 03.11.2012
comment
@Schwern Читает файл в несколько трехмерных хэшей.   -  person user13107    schedule 04.11.2012
comment
@ user13107, нам нужно увидеть соответствующую часть исходного кода, у которой заканчивается память.   -  person titanofold    schedule 04.11.2012
comment
@titanofold, я вернусь через несколько часов. Спасибо.   -  person user13107    schedule 04.11.2012
comment
Обновление: проблема решена с помощью 64-битного Perl. Но я также заметил, что программа запускалась без проблем на 32-битном Perl на Ubuntu. Так что, возможно, Strawberry perl в Windows занимает больше памяти, чем perl в Ubuntu.   -  person user13107    schedule 05.11.2012


Ответы (2)


Если вы пытались выделить или перераспределить огромную строку, массив или хэш, он мог бы запросить больший блок памяти, чем был доступен из системы. Хотя у вас есть 4 гигабайта реальной памяти и 4 гигабайта виртуальной, другие процессы могли потреблять большую ее часть.

В качестве альтернативы, ваша система может иметь ограничение памяти на процесс, которое может составлять 2 гигабайта.

Наконец, ваша ОС может быть 64-битной, но ваш Perl может быть 32-битным. В этом случае максимальный объем памяти, который он может адресовать, составит 2 гигабайта. Если вы разместите копию perl -V где-нибудь, чтобы мы могли ее просмотреть, мы сможем решить эту проблему.

person Schwern    schedule 03.11.2012
comment
См. Вывод perl -V здесь pastebin.com/mvF7YgKH Также обновите вопрос. Во время работы Perl я не выполняю никаких других тяжелых процессов. Браузер, текстовые редакторы и т. Д. Закрыты. - person user13107; 04.11.2012
comment
@ user13107, это похоже на 32-битную версию Perl. Это может быть ответом в том, что у вас может не быть установленной 64-битной версии, или вам нужно разбить вашу проблему на более мелкие части. - person titanofold; 04.11.2012
comment
@titanofold да, устанавливаю 64-битную версию Strawberry perl сейчас (без удаления 32-битной версии Perl). Будет ли это создавать проблемы с уже установленными модулями Perl? Придется ли мне переустанавливать все дополнительные модули, которые я установил из cpan? Спасибо. - person user13107; 04.11.2012
comment
@ user13107 Да, вам придется переустановить модули. Они могли быть скомпилированы как 32-битные библиотеки или программы, если они не были чистыми программами Perl. - person titanofold; 04.11.2012
comment
@titanofold К сожалению, 64-битный Perl не помог. Программа все еще завершалась на Memory usage: 1916203008 (примерно так же, как и раньше). Что я могу упустить? Я использовал другой исполняемый файл perl, который был в C:\strawberry64\perl\bin - person user13107; 04.11.2012
comment
@titanofold Он даже прошел этот тест ‹perlmonks.org / - person user13107; 04.11.2012
comment
Что-то что-то винда пошутила. ;) - person Schwern; 05.11.2012

У вас 32-битный Perl. Неудивительно, что Windows не может выделить более 2 ГБ памяти для 32-разрядного процесса. Если вы устанавливаете 64-битный Perl, он должен максимально использовать физическую оперативную память.

person mvp    schedule 03.11.2012