Я хотел бы получить класс, который предоставляет интерфейс для некоторых результатов анализа, но исходный результат определяется во время выполнения. В первый раз, когда вычисляется результат, это должно исходить из исходного файла данных. Этот расчет занимает много времени, поэтому я хотел бы сохранить его в файле результатов для быстрого доступа в будущем (я планирую использовать для этого msgpack
). Но если результат все еще находится в памяти, я бы хотел использовать эту версию, поэтому мне не нужно читать файл результатов.Постоянная память/кеширование
Программа проходит через многие из этих классов, поэтому потенциально много использования памяти. По этой причине, я думаю, было бы лучше иметь глобальный кеш фиксированного размера (или ограничения по времени). К сожалению, какие результаты понадобятся, заранее не известно, поэтому я не могу справиться с этим с некоторым шагом предварительной обработки. Мне нужна возможность получить новый результат из исходного файла, если это необходимо.
Так я представляю класс будет выглядеть примерно так:
class MyClass(object)
def __init__(self, orig_file, result_file, cache):
self.orig_file = orig_file
self.result_file = result_file
self.cache = cache
def get_result(self, name):
if name in self.cache:
return self.cache[name]
elif name in self.result_file:
return self.result_file[name]
else: # compute for first time
return self.orig_file.calculate(name)
Первоначальные поиски возвращенное так много потенциальных маршрутов, которые я переполнился. Я рассматриваю некоторую постоянную memoization как this, но мне нужно, чтобы упорство было специфичным для экземпляра класса. Затем я нашел это persistent lazy caching dictionary, который выглядит очень красиво (хотя мне не нужна ленивая оценка), но неясно, как работать с исходным файлом.
Есть ли какие-либо инструменты, которые каким-то образом отвечают на этот вопрос? И разумно ли пытаться добиться этого с помощью декораторов? (например, методы декорирования, которые будут выполнять поиск этого источника)
'' 'Программа проходит через многие из этих классов,' '' - Вы говорите, что будет (потенциально) множество экземпляров класса, и каждому из них потребуется доступ к * тем же * данным? – wwii
Существует много экземпляров класса, но каждый из них получит доступ к другому исходному файлу. –
Мое предложение: не утруждайте себя собственным кэшированием в памяти, просто храните данные в ваших файлах результатов и полагайтесь на кеширование файлов вашей ОС, чтобы обеспечить быстрый доступ к этим данным. –