Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Perl out of memory


Автор: Suppir 30.3.2011, 18:15
На машине стоит 4 гб оперативки.

Есть 10 файлов общим весом 6 Гб. Их необходимо распарсить и составить 1 файл с отфильтрованными и объединенными данными (примерный размер будет около 1 Гб).

При парсинге я создаю 1 большой хеш хешей (или 10 маленьких хешей, или двумерный массив = один фиг). Когда использование памяти доходит до 2 Гб, то Perl вылетает с ошибкой "Perl out of memory", хотя еще как минимум 1 Гб оперативки свободен. 

Что делать? Если вместо оперативки писать с помощью SQLite в базу данных, то процесс тянется вечность. По идее, оперативки хватает, почему же Perl вылетает? :(

Автор: gcc 30.3.2011, 18:27
можно попробовать использовать sysread, sysseek, sysopen
они будут по-байтово, по строчно считывать данные из файла

Автор: ming 30.3.2011, 19:42
на 32-битной системе процессу доступно максимум 2 гб памяти.

Автор: Suppir 30.3.2011, 20:01
ААА :(((
 smile 
smile 


Автор: Suppir 30.3.2011, 20:32
А можно ли как-то обойти ограничение? Нужно 3 Гб на процесс. 

Автор: ming 30.3.2011, 20:35
если не хотите привлекать БД, попробуйте http://search.cpan.org/~cangell/Tie-File-AsHash-0.08/lib/Tie/File/AsHash.pm

Автор: vivu 30.3.2011, 21:13
Если построчное считывание файлов вас устраивает, то воспользуйтесь Tie::File и работайте с файлом как с массивом. Стопов по памяти быть не должно.

Код

use Tie::File;

tie @my_file, 'Tie::File', '/tmp/file', memory => 20_000_000 or die "Tie::File Can't open file";
# работаете с файлом как с массивом строк
# ...
untie @my_file;

Автор: DurRandir 31.3.2011, 13:29
Комбинация cut/sort/uniq не подойдёт? В любом случае, придётся использовать какое-то внешнее хранилище, в том или ином виде. Проще, если результат точно поместится в оперативу, сложнее - если нет.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)