Python - Работа вокруг утечек памяти

Мы делаем это путем выхода из оболочки к gnuplot для генерации диаграмм как серверной стороны PNGs. Это является немного олдскульным, и диаграммы не являются интерактивными, но это работает и кэшируемо.

(Другая причина мы, это так, мы можем поместить точно ту же диаграмму в версию PDF отчета).

30
задан Community 23 May 2017 в 12:34
поделиться

3 ответа

Вы можете использовать что-то подобное, чтобы помочь отследить утечки памяти

>>> from collections import defaultdict
>>> from gc import get_objects
>>> before = defaultdict(int)
>>> after = defaultdict(int)
>>> for i in get_objects():
...     before[type(i)] += 1 
... 

. Теперь предположим, что тесты дают утечку памяти

>>> leaked_things = [[x] for x in range(10)]
>>> for i in get_objects():
...     after[type(i)] += 1
... 
>>> print [(k, after[k] - before[k]) for k in after if after[k] - before[k]]
[(<type 'list'>, 11)]

11, потому что мы утекли один список, содержащий еще 10 списков

60
ответ дан 27 November 2019 в 23:31
поделиться

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

сценарий оболочки следующим образом:

#!/bin/bash

for expnum in 1 2 3 4 5 6 7 8 9 10 11 ; do
    python youProgram ${expnum} otherParams
done

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

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

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

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

2
ответ дан 27 November 2019 в 23:31
поделиться

Потоки не помогли. Если вы должны отказаться от поиска утечки, то единственное решение для сдерживания ее эффекта - запускать новый процесс время от времени (например, когда тест оставил слишком высокое потребление памяти для вашего вкуса - - вы можете легко определить размер виртуальной машины, прочитав / proc / self / status в Linux и другие подобные подходы в других ОС).

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

Или, что более надежно, убедитесь, что по завершении каждого теста его идентификация добавляется к какому-то файлу с хорошо известным именем. Когда программа запускается, она начинает с чтения этого файла и, таким образом, знает, какие тесты уже были запущены. Эта архитектура более надежна, поскольку она также охватывает случай, когда программа дает сбой во время теста; конечно, чтобы полностью автоматизировать восстановление после таких сбоев, вам понадобится отдельная программа-сторожевой таймер и процесс, отвечающий за запуск нового экземпляра тестовой программы, когда он определяет, что предыдущая вышла из строя (он может использовать подпроцесс для этой цели - ему также нужен способ узнать, когда последовательность завершена, например нормальный выход из тестовой программы может означать, что хотя любой сбой или выход со статусом! = 0 означают необходимость запуска нового нового экземпляра).

Если эти архитектуры нравятся, но вам нужна дополнительная помощь в их реализации, просто прокомментируйте этот ответ, и я с радостью предоставлю пример кода - я не хочу делать это «упреждающе», если есть еще невысказанные проблемы, которые делают архитектуру неподходящей для вас. (Это также может помочь узнать, на каких платформах вам нужно работать).

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

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

4
ответ дан 27 November 2019 в 23:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: