У меня есть несколько запланированных задач Python-скрипта, которые выполняются на моем компьютере (не администратор на указанном компьютере - поэтому я не могу копаться глубже с perfmon или другими системными инструментами).Каждый день я наблюдаю довольно постоянное увеличение (7% от 16 ГБ ОЗУ) использования системной памяти и подозреваю возможную утечку памяти в моем коде.
Полный перезапуск компьютера приводит к очистке памяти.Примерно через 9-10 дней моя системная память снова исчерпана, требуя еще одного перезапуска.
Каждый сценарий выполняет примерно одну и ту же функцию:
- Доступ к сетевой базе данных SQL с использованием пакета sqlalchemy
- Создание кадра данных pandas из извлеченной базы данных, возвращаемого
- объединение кадра данных pandas с существующим файлом Excel .XLS и сохранение поверх существующего файла XLS
- импорт сохраненного файла XLS и его стиль (цвет, ширина столбца и т. д.) с пакетом Openpyxl
После того, как я закончу с каждым соответствующим объектом, я удаляю его так:
del (sample_df, previous_df)
В концеМой сценарий Я также включил следующий код для перехвата любых глобальных переменных, которые я пропустил, и вручную запустил сборщик мусора:
for name in dir():
if not name.startswith('_'):
del globals()[name]
import gc
gc.collect()
Я попытался использовать пакет Pympler и его возможности .tracker, и в концемоего скрипта, запущенного
tracker.print_diff()
, приводят к тому, что следующие объекты (слева?) в памяти, которые, по-видимому, не были собраны мусорным соllector:
types | # objects | total size
list | 19018 | 968.68 KB
str | 19025 | 862.44 KB
int | 1122 | 13.15 KB
После запуска сборщика мусора я также рассмотрел использование памяти элементами, все еще находящимися в локальном пространстве имен:
import sys
for var, obj in locals().items():
print var, sys.getsizeof(obj)
Возвращает:
__ 36
__builtin__ 28
SummaryTracker 452
gc 28
__package__ 8
_i11 78
__doc__ 85
_i 66
__file__ 208
_sh 28
name 23
_7 256
_6 36
_3 3212
_2 36
_i13 190
_i12 66
_iii 66
_i10 66
_oh 140
_dh 40
_i9 110
_i8 390
_i7 36
_i6 32
_i5 390
_i4 190
_i3 42
_i2 38
_i1 390
tracker 32
__builtins__ 28
sys 28
__name__ 29
___ 3212
_ 256
_ii 78
_ih 100
Кажется, что объект "___" использует приличную память, но я понятия не имею, откуда это.
Я попытался включить столько же устранения неполадок, сколько и я.Заранее спасибо за помощь.