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

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

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

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

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

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

  • Существует ли библиотека для предотвращения повторных представлений формы для django?
  • Форматирование чисел в шаблонах django
  • См. Несколько моделей в представлении / шаблоне в Django
  • Как использовать десятичное число в шаблоне URL Django?
  • Как сделать db dumpfile в django
  • python (django) hashlib vs Nodejs crypto
  • как копировать модули из одного виртуального в другой
  • Как выводить абзац с разрывами строк в django и mysql?
  • 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 .

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

    Interesting Posts

    Python Socket Flush

    Приложение Django зависает при попытке подключиться к базе данных через Apache

    python + selenium webdriver: использование метода аутентификации

    Python – способ рекурсивного поиска и замены строки в текстовых файлах

    Matplotlib imshow, динамическая пересборка на основе масштабирования

    python matplotlib plot разреженный шаблон матрицы

    Как добавить миниатюру в сообщение WordPress с помощью библиотеки xmlrpclib Python?

    Преобразовать строку в список на Python без использования Eval?

    Regex в python: возможно ли получить совпадение, замену и окончательную строку?

    Как может быть отказано в python 2 doctest и все же не имеет никакого значения в значениях в сообщении об ошибке?

    Как мне избавиться от этого пробела в моем QTableWidget?

    Python эквивалент Ruby's 'method_missing'

    Как показать графики matplotlib в python

    Python 3.0.1 Исполняемый создатель

    Не удается запустить работника сельдерей на Windows 10 с помощью программы «PicklingError»

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