LINUX.ORG.RU

оптимизация потребления памяти программой на python

 , ,


0

3

Есть небольшой скриптик, написанный на python. Слушает сигналы на D-Bus и пишет кое-что в ~5 баз sqlite. Версия python - 2.7.2 Софтина ничего не копит нигде, что получила то сразу отдает. Жрет в начале где-то 8 мегов оперативы, спустя несколько часов - уже 13 мегабайт. Отчего такой может быть здоровый расход? Можно как-то его урезать? В базу пишется не то чтобы много, все вырастает мегабайт на 8 в сутки. sqlite настраивается так:

PRAGMA page_size = 2048;
PRAGMA synchronous = FULL;
PRAGMA temp_store = MEMORY;
PRAGMA journal_mode = MEMORY;

Но вроде как даже если в базу не писать ничего, жрет все равно столько же. Как отучить?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

может ты сам где-то эту память потерял? закеж код

stevejobs ★★★★☆
()

Утечка памяти в скрипте скорей всего.

suvor-07
()

Про фрагментацию памяти не забываем.

thriller ★★
()

курсоры закрываешь?

ZuBB ★★★★★
()
Ответ на: комментарий от ZuBB

потом рост существенно замедляется. Видел рост до 18 мегабайт за 3 недели работы, но вроде как не предел, потому как наблюдалась активность oom-killer'а потом...

Исходник как подчищу от левых привязок и узнаваемости, выложу на гитхаб. Там много модулей и привязано к железу, да и нельзя показывать вроде как... :)

slapin ★★★★★
() автор топика
Ответ на: комментарий от slapin

ЯННП

оптимизация потребления памяти

начале где-то 8 мегов оперативы

спустя несколько часов - уже 13 мегабайт

Видел рост до 18 мегабайт за 3 недели работы

наблюдалась активность oom-killer'а потом

напомните мне пожалуста какую проблему мы пытаемся решить

ZuBB ★★★★★
()
Ответ на: ЯННП от ZuBB

1. Питон 2. Жрет память. 3. Нормально ли жрать столько при использовании sqlite и d-bus как описано в сценарии? 4. А можно ли как-то эту прожорливость уменьшать?

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

slapin ★★★★★
() автор топика

13 мегабайт. Отчего такой может быть здоровый расход?

Гхм. ТС, разупорись. Это абсолютно нормальный расход.

Даже не буду спрашивать как мерил.

anonymous
()

Ну, есть у Питона особенность - он не отдает выделенную память системе (или не всегда отдает). Но морочиться сейчас из-за 13 метров? Небось VSZ, а не RSS?

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну, есть у Питона особенность - он не отдает выделенную память системе (или не всегда отдает)

Не всегда.

http://www.evanjones.ca/memoryallocator/

И небольшое пояснение к статье

http://python.su/forum/topic/7590/

На момент задания вопроса у меня подобное поведение наблюдалось со словарями. Т.е. вроде бы и del'ом объект снес, а память системе не отдается.

srj ★★
()
Последнее исправление: srj (всего исправлений: 2)

Сдается мне, твой вопрос - преждевременная оптимизация. Естественно, результатом будет головная боль :-)

menangen ★★★★★
()
Ответ на: комментарий от tailgunner

Ну, есть у Питона особенность - он не отдает выделенную память системе (или не всегда отдает).

Ничто обычно не отдаёт память системе если сильно не озадачиться такой проблемой.

mashina ★★★★★
()

Скриптик DjangoORM не использует? Если использует, обрати внимание на connection.queries, она имеет обыкновение раздуваться.

certanista
()
Ответ на: комментарий от srj

Не всегда.

из-за фрагментации эта фича не работает (сейчас даже тестовый пример фейлится), особенно если программа делает что-то нетривиальное.

mashina ★★★★★
()

Это фрагментация памяти. Скриптовые языки имею особенность выделять кучу памяти маленькими кусочками на всякие обьекты, и т.к. стековой памяти там нету - всё через маллок. Память со временем фрагментируется и мусор остаётся высеть в памяти. Можеш поробовать скормить опенбсд аллокатор питону, либо напиши на C/C++, 2 метра - потолок.

vova7890 ★★★
()
Ответ на: комментарий от kto_tama

Спасибо за memory_profiler Обнаружил, что больше всего памяти выжирает import dbus - 6MB RSS. Как побороть?

slapin ★★★★★
() автор топика
Ответ на: комментарий от true_admin

D-Bus нужен, да и все остальное им пользуется. Почему-то C-шная программа, использующая D-Bus (gpib/gio), жрет значительно меньше памяти.

slapin ★★★★★
() автор топика
Ответ на: комментарий от slapin

Будь мужиком, пиши в сокет dbus напрямую без всяких прослоек.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.