Утечка памяти без альтернативы OrderedDict в Python 2.7? - PullRequest
2 голосов
/ 09 февраля 2020

Мы проверяем, оставляет ли один из наших пакетов объекты мусора в Python g c, и обнаружили, что объекты collections.OrderedDict не удаляются механизмом ref-count, а помещаются в G C, с следующие ссылки (когда pprint'ing их и немного подправил вывод):

<type 'list'> object at 0x10a876ab8:
[ <Recursive reference to list object at 0x10a876ab8>,
  <Recursive reference to list object at 0x10a876ab8>,
  None]

Это похоже на проблему, описанную в https://bugs.python.org/issue9825. Эта проблема была исправлена ​​в Python 3.2, и действительно, показанный выше эталонный цикл появляется в Python 2.7, но не в Python 3.7.

Существует ли альтернатива collections.OrderedDict, свободная от повторного цикла? для Python 2,7?

Обновление:

  1. Я обнаружил, что ordereddict.OrderedDict также имеет тот же опорный цикл.

  2. Я полностью осознаю, что Python 2.7 не поддерживается. Тем не менее, нам все еще нужно поддерживать наш пакет на Python 2.7.

  3. Ответ @Ramsha Siddiqui указывает на SortedDict Django. Я проверил, что в Django 1.7 его SortedDict не имеет контрольных циклов. Однако SortedDict был удален из Django (по крайней мере, в его версии 1.11).

1 Ответ

0 голосов
/ 09 февраля 2020

Вы можете использовать sorted () для любых элементов словаря, например:

odt = dict(sorted(dt.items()))

ОБНОВЛЕНИЕ: сохранение исходного порядка

Если вы хотите сохранить оригинальный порядок, для этого тоже есть библиотека Django:

from django.utils.datastructures import SortedDict
d2 = SortedDict()

Дайте мне знать, если это поможет вашему делу.

ОБНОВЛЕНИЕ: [Дублировать] Ссылка: Python упорядоченный сборщик мусора?

del collections.OrderedDict.__del__

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

...