Найти все ссылки на объект в python

Что такое хороший способ найти все ссылки на объект в python?

Причина, по которой я спрашиваю, заключается в том, что похоже, что у нас «утечка памяти». Мы загружаем файлы изображений на сервер из веб-браузера. Каждый раз, когда мы это делаем, использование памяти увеличивается на сервере, пропорционально увеличивается размер файла, который был только что загружен. Эта память никогда не освобождается сборкой мусора python, поэтому я думаю, что, вероятно, есть случайные ссылки, указывающие на данные изображения, которые не удаляются или не выходят за рамки, даже в конце каждого запроса.

Я считаю, что было бы неплохо спросить python: «Какие ссылки все еще указывают на эту память?» так что я могу выяснить, что держит сбор мусора от его освобождения.

В настоящее время мы запускаем Python и Django на сервере Heroku.

Любые предложения и идеи приветствуются, спасибо огромное!

2 Solutions collect form web for “Найти все ссылки на объект в python”

Стандартная библиотека Python имеет gc модуль, содержащий API-интерфейс сборщика мусора. Одна из функций, которую вы хотите получить, – это

 gc.get_objects() 

Эта функция возвращает список всех объектов, которые в настоящее время отслеживаются сборщиком мусора. Следующий шаг – проанализировать его.

Если вы знаете объект, который хотите отслеживать, вы можете использовать функцию getrefcount sys модуля:

 >>> x = object() >>> sys.getrefcount(x) 2 >>> y = x >>> sys.getrefcount(x) 3 

Модуль gc Python имеет несколько полезных функций, но похоже, что gc.get_referrers() – это то, что вы ищете. Вот пример:

 import gc def foo(): a = [2, 4, 6] b = [1, 4, 7] l = [a, b] d = dict(a=a) return l, d l, d = foo() r1 = gc.get_referrers(l[0]) r2 = gc.get_referrers(l[1]) print r1 print r2 

Когда я запустил это, я вижу следующий вывод:

 [[[2, 4, 6], [1, 4, 7]], {'a': [2, 4, 6]}] [[[2, 4, 6], [1, 4, 7]]] 

Вы можете видеть, что первая строка – l и d , а вторая – только l .

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

  • Сельдерей, комбу и джанго - ошибка импорта
  • Как я могу группировать модульные тесты в Django с более высокой степенью детализации, чем приложение?
  • Blank label_suffix по всему проекту Django
  • Django: Любая разница между `QuerySet .__ nonzero__` и` QuerySet.exists`?
  • Python + Django + VirtualEnv + Windows
  • Джанго. Шаблоны, работающие локально, но не на pythonanywhere.com
  • Аннотации запросов Django с булевым полем
  • Сплит models.py в несколько файлов
  •  
    Interesting Posts for Van-Lav

    Почему я получаю AttributeError: объект «KerasClassifier» не имеет атрибута «модель»?

    Какой хороший аналог Flask / Python / WSGI для общедоступных хранилищ PHP Apache, таких как apc_store / apc_fetch?

    MemoryError с python / pandas и большими левыми внешними соединениями

    Разбирая программу python на функции, как сделать одну из основных функций?

    getsizeof возвращает то же значение для кажущихся разных списков

    Python Django удаляет текущий объект

    SQLAlchemy + SQL Injection

    Невозможно импортировать QtWebKitWidgets в PyQt5

    nltk: Как предотвратить возникновение собственных существительных

    json query, который возвращает родительский элемент и дочерние данные?

    django-filter использует разбиение на страницы

    Преобразование в (не из) формата ipython Notebook

    Регулярное выражение для управления экранированными символами для элементов, таких как строковые литералы

    Процесс завершен с кодом выхода 139 после обновления с python 2.7.6 64 бит до 2.7.10 32 бит

    subprocess.Popen.stdout – чтение stdout в режиме реального времени (снова)

    Python - лучший язык программирования в мире.