Я написал небольшой класс кэша. Он основан на стандартном словаре и сохраняется на диске. Поскольку размер кэша рабочей системы теперь превысил системную память, я хотел бы реализовать механизм выдачи результатов. Для этого я хотел бы вести подсчет и выбрасывать наименее важные элементы. Один из способов сделать это — использовать OrderedDict и переместить все недавно использованные элементы в конец, а затем я смогу выбросить элементы спереди, когда размер кэша превысит размер.
Чтобы добиться этого, мне сначала нужен словарь, который будет хранить недавно использованные элементы на одном конце и наименее недавно использованные элементы на другом. В документации Python есть несколько полезных примеров. Я создал класс ниже. Он немедленно завершается сбоем при выполнении самой простой операции — popitem().
class LastUpdatedOrderedDict(OrderedDict):
def __setitem__(self, key, value):
super().__setitem__(key, value)
self.move_to_end(key)
def popitem(self, last = True):
return super().popitem(last=last)
def __getitem__(self, key):
value = super().__getitem__(key)
self.move_to_end(key)
return value
Если использовать приведенный выше класс для выполнения следующего кода, выдается исключение:
d = LastUpdatedOrderedDict({1: 'a', 2: 'b', 3: 'c'})
x = d.popitem() # Throws exception
В частности, если метод __getitem__() прерывается по адресу self.move_to_end(key), то можно наблюдать следующее поведение:
key in self
Out[4]: True
key in self.keys()
Out[5]: True
self.keys()
Out[6]: odict_keys([1, 2])
key in set(self.keys())
Out[7]: False
Как лучше всего решить эту проблему? Четко,popitem() вызывает dict.__getitem__(), но, когда дело доходит до ключей, он, похоже, находится в каком-то промежуточном состоянии.
EDIT: исключение, которое я получаю, приведено ниже:
result = testfunction(**testargs)
File "/infra/test/test_caching.py", line 105, in test_LastUpdatedOrderedDict
x = d.popitem()
File "/home/infra/infra/caching.py", line 22, in popitem
return super().popitem(last=last)
File "/infra/infra/caching.py", line 26, in __getitem__
self.move_to_end(key)
KeyError: 3
Подробнее здесь: https://stackoverflow.com/questions/798 ... ed-element
OrderedDict упорядочен по последнему использованному элементу. ⇐ Python
Программы на Python
-
Anonymous
1764260196
Anonymous
Я написал небольшой класс кэша. Он основан на стандартном словаре и сохраняется на диске. Поскольку размер кэша рабочей системы теперь превысил системную память, я хотел бы реализовать механизм выдачи результатов. Для этого я хотел бы вести подсчет и выбрасывать наименее важные элементы. Один из способов сделать это — использовать OrderedDict и переместить все недавно использованные элементы в конец, а затем я смогу выбросить элементы спереди, когда размер кэша превысит размер.
Чтобы добиться этого, мне сначала нужен словарь, который будет хранить недавно использованные элементы на одном конце и наименее недавно использованные элементы на другом. В документации Python есть несколько полезных примеров. Я создал класс ниже. Он немедленно завершается сбоем при выполнении самой простой операции — popitem().
class LastUpdatedOrderedDict(OrderedDict):
def __setitem__(self, key, value):
super().__setitem__(key, value)
self.move_to_end(key)
def popitem(self, last = True):
return super().popitem(last=last)
def __getitem__(self, key):
value = super().__getitem__(key)
self.move_to_end(key)
return value
Если использовать приведенный выше класс для выполнения следующего кода, выдается исключение:
d = LastUpdatedOrderedDict({1: 'a', 2: 'b', 3: 'c'})
x = d.popitem() # Throws exception
В частности, если метод __getitem__() прерывается по адресу self.move_to_end(key), то можно наблюдать следующее поведение:
key in self
Out[4]: True
key in self.keys()
Out[5]: True
self.keys()
Out[6]: odict_keys([1, 2])
key in set(self.keys())
Out[7]: False
Как лучше всего решить эту проблему? Четко,popitem() вызывает dict.__getitem__(), но, когда дело доходит до ключей, он, похоже, находится в каком-то промежуточном состоянии.
EDIT: исключение, которое я получаю, приведено ниже:
result = testfunction(**testargs)
File "/infra/test/test_caching.py", line 105, in test_LastUpdatedOrderedDict
x = d.popitem()
File "/home/infra/infra/caching.py", line 22, in popitem
return super().popitem(last=last)
File "/infra/infra/caching.py", line 26, in __getitem__
self.move_to_end(key)
KeyError: 3
Подробнее здесь: [url]https://stackoverflow.com/questions/79831852/ordereddict-ordered-by-most-recently-used-element[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия