| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Python: Общие вопросы > принудительная очистка памяти |
| Автор: kulibinka 7.2.2007, 07:02 |
| работая в питоне с большими массивами текстов, пришел к необходимости как-то разобраться с памятью, которую при этой работе питон себе забирает. например, понятно что в общем обработка несколькогиговых текстов в лоб загнет питон. поэтому я сейчас разбиваю текст на части, обрабатываю каждую часть в отдельности, промежуточные результаты обработки сохраняю, а после обработки всех частей сливаю все результаты в одну кучу... и все равно, даже при таком подходе питон медленно но уверенно забирает себе все больше и больше памяти, и потому под конец работы весь файл подкачки все равно оказывается забитым и скрипт приходится выключать и запускать наново (хорошо что результаты обработанной части текстов сохраняются, и потому через несколько запусков скрипта я рано или поздно довожу скрипт до победного конца). но хотелось бы знать: как заставить питон освободить всю ненужную мне память (кроме тех переменных, которые я ему скажу)? попытки найти хоть что-то о принудительной очистке памяти в питоне, натыкался только на фразы типа "Python never returning memory to the operating system". Т.е. расслабся, используй xrange, купляй оперативки, увеличивай файл подкачки и жди нового питона... все действительно так мрачно, или же есть решение этой проблемы? |
| Автор: Daevaorn 7.2.2007, 08:43 |
| посмотри тут http://docs.python.org/lib/module-gc.html |
| Автор: J2A 7.2.2007, 10:48 |
| Возможно, есть вариант пересмотреть алгоритм обработки. Нужно ли, чтобы весь объем текст был в памяти? Если это последовательная обработка, стоит использовать итераторы/генераторы. Возможно, сериализация тоже будет вариантом - zodb/shelve? Если точнее опишешь что именно ты делаешь с текстами и как, то будет проще что-то советовать. |
| Автор: kulibinka 7.2.2007, 17:55 | ||||||
Написал пример кода, в котором я ну совершенно не понимаю куда уходит память:
И информация по коду и статистике:
Добавлено @ 18:08 максимально упростил пример, утечка остается
|
| Автор: kulibinka 7.2.2007, 18:52 |
| новая информация: я знаю что течет мой модуль modules потому что если вынести ф-ю Get_norms_from_text в код теста и ничего больше не использовать, то все отлично. если же использовать ее подключая модуль modules, то начинается утечка. узнать бы что именно в этом модуле течет... Добавлено @ 19:06 бррр как так - подключаю модуль, который сам по себе работает отлично, и начинается утечка. а не подключаю - не начинается... причем нигде в модулях не используется ничего похожего (связанного) на те ф-и которые в этом тестовом коде используются... ну откуда она может взяться? |
| Автор: J2A 7.2.2007, 19:11 | ||||
| На вскидку: 1) Используй xrange вместо range.Почему: http://omsk.lug.ru/wacko/Python/Perfomance/PerfomanceTips#h263-15 и http://omsk.lug.ru/wacko/Python/Perfomance/GentooHacks#h258-10. 2) Зачем тебе в памяти хранить строки, если ты только и делаешь, что цикл по ним? Сделай итератор, который будешь перезапускать в каждой итерации главного цикла. Очень сильно сэкономишь память. 3) Не импортируй все из модуля. http://omsk.lug.ru/wacko/Python/Perfomance/MyTips#h448-3. 4) Вообще выкинь цикл по строкам - используй list comprehensive: вместо
делай так:
http://omsk.lug.ru/wacko/Python/Perfomance/PerfomanceTips#h263-7. В общем, be Pythonic. P.S. И переменные нормально называй. experiments_number например |
| Автор: kulibinka 7.2.2007, 19:16 |
| Спасибо за советы. Но без применения 1, 2 и 4 код отлично работает, так как если заменить ф-ю Get_norms_from_text то никакой утечки нету. А ответ где-то видимо около 3, я там как разу кручусь - пытаюсь импортировать только используемые ф-и и посмотреть на утечку. Добавлено @ 19:19 а с пунктом 4 я категорически несогласен, так как предложенный Вами варианта на порядок тугодумнее. Да, он питоник и на него приятно смотреть, но работает он туго. |
| Автор: J2A 7.2.2007, 19:26 |
| На порядок тугодумнее? Факты-с в студию! Пока не увижу - не поверю. |
| Автор: kulibinka 7.2.2007, 20:45 | ||
| попытался подобрать факты - не смог помню что еще в самом начале обработки больших текстовых массивов информации питоник-вариант обработки списков у меня практически всегда забивал весь файл подкачки и скрипт вылетал с ошибкой мемориеррор, но при этом отлично продолжал работать если я обрабатывал списки тупо в лоб. я тогда решил что питоник не предусмотрен для больших-пребольших списков, и с того момента пишу все только в лоб. но сейчас попытки вызвать ту же ошибку
ни к чему не привели - и по времени, и по использованию файла подкачки все ф-ии работают приблизительно одинаково (за 75-80 секунд). хотя работать в питоник-стайл оно конечно красивше Добавлено @ 20:48 кстати, я поборол утечку оказывается у меня modules использовал psyco, и после убивания psyco утечка памяти прошла сама собой. наверное это потому, что psyco не дружит с си, а модуль, который использует ф-я Get_norms_from_text, написан как раз на си. всем огромное спасибо за советы! |
| Автор: J2A 8.2.2007, 06:08 | ||
Немного гиперболизируя, ты тестируешь феррарри и трактор по скорости. Цепляешь к обоим прицеп на полторы тонны. По скорости 10 км/ч с прицепом по грунтовке, делаешь вывод, что максимальные скорости одинаковы, только феррарри чуть покрасивше.
|
| Автор: kulibinka 8.2.2007, 13:08 |
| абсолютно правильная аналогия только я без прицепов от двух тонн не ездяю. А вообще я больше люблю трактора... Потому что в Ваше красивое ферари я вообще ничего своего вкрутить не смогу - оно цельное, без нужных мне дырок для болтов, и предназначено использоваться только как есть. Ну а трактор это хорошо - делай дырок сколько угодно, прикручивай туда кучу прибамбасов, грузи его как угодно, и он при всем при этом останется старым добрым рабочим трактором. У меня например на все тракторы установлен джпс-навигатор, потому что без него совершенно непонятно работают ли скрипты, срок работы которых несколько часов, или же просто стоят... А ферари там тихо мирно сопит... работает, не работает - совершенно непонятно... и через 10 минут черный экран начинает нервировать... движение есть, а прогресса нет... ну что с него возьмешь - феррари оно и в африке феррари |