Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 15, 2013 15:21:11

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и память

Мне тут долго и убедительно рассказывали, какой в питоне плохой GC, что я даже засомневался. Он что, правда не умеет освобождать однажды занятые страницы памяти? Логично, что если я напишу код, который постоянно создает объекты и уничтожает ссылки на них, то GC не будет успевать их переваривать без принудительного gc.collect() и потребление памяти будет постоянно расти. Но неужели нереально заставить интерпретатор отпустить память и отдать ее другому приложению? Или я вообще пишу бред?



Офлайн

#2 Окт. 15, 2013 15:34:08

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Python и память

Не переживайте. Все переварится, сколлектится, будет отдано другому приложению.
http://stackoverflow.com/questions/15455048/releasing-memory-in-python

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



Офлайн

#3 Окт. 15, 2013 15:46:01

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и память

Soteric
Интересная получается картина. Выходит, что в интерпретаторе в определенной структуре данных хранятся все аллоцированные объекты, например, инты. В итоге уничтожение объекта выкидывает его из оттуда, но сам размер структуры может измениться мало, потому что память под нее уже зааллоцирована с концами. Т.е., действительно, к потреблению памяти, которое было сразу после запуска интерпретатора, вернуться невозможно.



Отредактировано Enchantner (Окт. 15, 2013 15:46:21)

Офлайн

#4 Окт. 15, 2013 16:00:51

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Python и память

И это нормально :)



Офлайн

#5 Окт. 15, 2013 16:11:38

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и память

Soteric
Ну а как же все те вещи с “непрерывным программированием”, когда свеженаписанный код просто встраивается в глобальный эвентлуп приложения без рестарта и проблем с ресурсами? :) Получается, что чем дольше работает приложение - тем неизменно больше оно будет жрать память, причем это будет зависеть от размеров объектов, с которыми оно работает, и, например, от количества пользователей, особенно когда много тредов. Как-то это печально, хоть и нормально.

P.S. и да, я понимаю, что realloc будет опускать всю производительность ниже плинтуса в таком случае, но все равно за державу обидно.



Офлайн

#6 Окт. 15, 2013 16:19:57

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Python и память

Видимо я не так понял. В общем память не будет бесконечно расти. Если GC “соберет” объект, то эта память будет переиспользована под другой объект. По ссылке на stackoverflow, насколько я понимаю, рассматривалась проблема возникновения некоторой фрагментарности в отдельных случаях. Но в целом память течь не должна.



Офлайн

#7 Окт. 15, 2013 16:53:49

Enchantner
От:
Зарегистрирован: 2009-02-11
Сообщения: 442
Репутация: +  0  -
Профиль   Отправить e-mail  

Python и память

Soteric
гипотетическая ситуация - мы читаем построчно данные из произвольного набора. Где-то в середине данных попадается длиннющщая строка, например, гигантский json, записанный в одну строку. Все, даже если мы читали эти данные итератором - большой кусок памяти, в который была прочтена эта строка, останется неосвобожденным до конца работы приложения. Верно?



Офлайн

#8 Окт. 15, 2013 18:42:13

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Python и память

Enchantner
Все, даже если мы читали эти данные итератором - большой кусок памяти, в который была прочтена эта строка, останется неосвобожденным до конца работы приложения. Верно?
С чего бы.
Маловероятно, что GC освободит всю память сразу после чтения следующей строки - что логично, вдруг следующая строка у вас такая же длинная или вы решили seek() сделать.
Первый цикл очистки GC пройдет сразу после выходя из цикла чтения.
Если вы закрываете файл - следующий цикл очистки.
Если GC в первом цикле не очистил память, он это сделает во втором.

Но это лирика, я не уверен в правильности постановки задачи.
Понимаете, пока даже не говорим о выборе инструмента и не обсуждаем вопрос обработки очень больших данных, не помещающихся целиком в память.
А ведь могут быть и данные, которые целиком считать нельзя, т.к. объем памяти плюс дисковый своп не могут их вместить. :)

Программистские задачи возникают из определенных задач из конкретной предметной области.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version