У меня есть небольшой многопоточный скрипт, работающий в django, и со временем его запуск использует все больше и больше памяти. Оставляя его на целый день, он ест около 6 ГБ ОЗУ, и я начинаю заменять.Python: Отладка утечки памяти
После http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks я вижу это как наиболее распространенных типов (только с 800M памяти, используемой):
(Pdb) objgraph.show_most_common_types(limit=20)
dict 43065
tuple 28274
function 7335
list 6157
NavigableString 3479
instance 2454
cell 1256
weakref 974
wrapper_descriptor 836
builtin_function_or_method 766
type 742
getset_descriptor 562
module 423
method_descriptor 373
classobj 256
instancemethod 255
member_descriptor 218
property 185
Comment 183
__proxy__ 155
который ничего странного не показывают. Что мне теперь делать, чтобы помочь отладить проблемы с памятью?
Обновление: Попытка некоторых вещей, которые люди рекомендуют. Я запускал программу за одну ночь, и когда я работаю, используется 50% * 8G == 4G ОЗУ.
(Pdb) from pympler import muppy
(Pdb) muppy.print_summary()
types | # objects | total size
========================================== | =========== | ============
unicode | 210997 | 97.64 MB
list | 1547 | 88.29 MB
dict | 41630 | 13.21 MB
set | 50 | 8.02 MB
str | 109360 | 7.11 MB
tuple | 27898 | 2.29 MB
code | 6907 | 1.16 MB
type | 760 | 653.12 KB
weakref | 1014 | 87.14 KB
int | 3552 | 83.25 KB
function (__wrapper__) | 702 | 82.27 KB
wrapper_descriptor | 998 | 77.97 KB
cell | 1357 | 74.21 KB
<class 'pympler.asizeof.asizeof._Claskey | 1113 | 69.56 KB
function (__init__) | 574 | 67.27 KB
Это не суммируется с 4G и не дает мне никаких больших данных, структурированных для исправления. Юникод - из набора() «done» узлов, и список выглядит как случайный weakref
s.
Я не использовал guppy, так как для этого требовалось расширение C, и у меня не было корня, поэтому это было бы болью для сборки.
Ни один из объектов, которые я использовал, имеет метод __del__
, и, просматривая библиотеки, он не похож на django и python-mysqldb. Любые другие идеи?
"работает в Django"? Вы имеете в виду, что вы используете веб-сервер Django для выполнения дополнительной обработки фоновой обработки без веб-сервиса? Рассматривали ли вы расщепление этого не-веб-материала в отдельный процесс? –
Это задание cron, которое импортирует Django settgings.py и использует многие функции Django ORM. Таким образом, он не создается сервером, но использует многие функции (что могло бы быть уместным). –