Проблемы с GC при использовании WeakValueDictionary для кешей

Согласно официальной документации Python для модуля weakref, «основное использование слабых ссылок заключается в реализации кешей или отображений, содержащих большие объекты…». Итак, я использовал WeakValueDictionary для реализации механизма кэширования долго выполняющейся функции. Однако, как оказалось, значения в кеше никогда не оставались там до тех пор, пока они действительно не использовались снова, и их приходилось пересчитывать почти каждый раз. Поскольку сильных ссылок между обращениями к значениям, хранящимся в WeakValueDictionary, не было, сборщик мусора избавился от них (хотя проблем с памятью не было абсолютно).

Теперь, как я должен использовать слабые ссылки для реализации кэша? Если я оставлю сильные ссылки где-то явно, чтобы сборщик мусора не удалил мои слабые ссылки, в первую очередь не было бы смысла использовать WeakValueDictionary. Вероятно, должна быть какая-то опция для GC, которая говорит ему: удалять все, на что вообще нет ссылок, и все со слабыми ссылками, только когда заканчивается память (или превышен какой-то порог). Есть ли что-то подобное? Или есть лучшая стратегия для такого типа кеша?

5
задан Elmar Zander 13 March 2012 в 16:21
поделиться