Используя большой разреженный ДИКТ в качестве кэша?

#python #dictionary #caching #sparse-matrix

Вопрос:

Я использую большой Дикт в качестве кэша. Структура { string : float }

Это очень редкий диктант, т. е. большинство записей с плавающей точкой равно нулю.

Я ищу методику «консолидации» каким-то образом нулевого кв для экономии памяти, но скорость доступа должна оставаться примерно одинаковой /в противном случае я бы использовал redis или db/.

Попадание в кэш ~40нс экономит мне вызов функции ~100-200 мс.

я уже использую sys.intern()

Любой трюк или техника, которые могли бы сработать.


может быть, это сработает : https://github.com/KeyviDev/keyvi

Хранилище KV, использующее FSM для сжатия ключей с аналогичными значениями

Комментарии:

1. Можете ли вы предположить, что любая строка, не содержащаяся в dict, имеет значение с плавающей точкой 0, или вам также нужно отслеживать, какие строки находятся в dict, а какие нет? Потому что я бы просто сделал cache.get('string', 0.0) , если бы вы могли предположить, что все, что не указано в диктанте, равно 0.

2. нет.. именно по этой причине я добавляю их в кэш.. возможные строковые ключи почти бесконечны

3. Тогда нет — это уже наиболее эффективно (интерпретатор python в любом случае будет просто повторно использовать один и тот же неизменяемый 0.0 файл, он не должен хранить миллионы из них в памяти). На самом деле, когда я пишу это, я не уверен, что это работает для поплавков; может быть, просто сохраните их как целочисленные 0, а не как плавающие 0,0 с.