Python: словарь, который сохраняет только последние n вставленных ключей - PullRequest
0 голосов
/ 30 июня 2018

Я планирую прочитать миллионы маленьких файлов с диска. Чтобы минимизировать ввод / вывод, я планировал использовать словарь, который сопоставляет путь к файлу с его содержимым. Я только хочу, чтобы словарь сохранил последние n ключей, вставленных в него, хотя (таким образом, словарь будет действовать как кеш).

Есть ли в Python структура данных, которая уже реализует это поведение? Я хотел проверить, прежде чем изобретать велосипед.

Ответы [ 3 ]

0 голосов
/ 30 июня 2018

Используйте для этого collections.deque с максимальным значением 6, чтобы в нем сохранялись только последние 6 элементов и информация сохранялась в виде пар ключ-значение

from collections import deque
d = deque(maxlen=6)
d.extend([(1,1),(2,2),(3,3),(4,4), (5,5), (6,6)])
d
# deque([(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)], maxlen=6)
d.extend([(7,7)])
d
# deque([(2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7)], maxlen=6)
0 голосов
/ 30 июня 2018

Для моей конкретной проблемы, так как мне нужно было читать файлы с диска, я думаю, что я буду использовать кэш lru, как предложил @PatrickHaugh. Вот один из способов использования кеша:

from functools import lru_cache

@lru_cache(maxsize=10)
def read_file(file_path):
  print(' * reading', file_path)
  return file_path # update to return the read file

for i in range(100):
  if i % 2 == 0:
    i = 0 # test that requests for 0 don't require additional i/o
  print(' * value of', i, 'is', read_file(i))

Вывод показывает, что запросы на 0 не влекут за собой дополнительный ввод / вывод, что идеально.

0 голосов
/ 30 июня 2018

Вы можете использовать collections.OrderedDict и его метод popitem, чтобы обеспечить сохранение только последних n ключей, добавленных в словарь. Указание last=False с помощью popitem гарантирует, что поведение будет «FIFO», то есть первым вошел, первым вышел. Вот тривиальный пример:

from collections import OrderedDict

n = 3
d = OrderedDict()

for i in range(5):
    if len(d) == n:
        removed = d.popitem(last=False)
        print(f'Item removed: {removed}')
    d[i] = i+1

print(d)

Item removed: (0, 1)
Item removed: (1, 2)
OrderedDict([(2, 3), (3, 4), (4, 5)])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...