| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| ААА :((( |
| Автор: 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 и работайте с файлом как с массивом. Стопов по памяти быть не должно.
|
| Автор: DurRandir 31.3.2011, 13:29 |
| Комбинация cut/sort/uniq не подойдёт? В любом случае, придётся использовать какое-то внешнее хранилище, в том или ином виде. Проще, если результат точно поместится в оперативу, сложнее - если нет. |