2016-03-12 2 views
0

Я хотел бы получить класс, который предоставляет интерфейс для некоторых результатов анализа, но исходный результат определяется во время выполнения. В первый раз, когда вычисляется результат, это должно исходить из исходного файла данных. Этот расчет занимает много времени, поэтому я хотел бы сохранить его в файле результатов для быстрого доступа в будущем (я планирую использовать для этого 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, который выглядит очень красиво (хотя мне не нужна ленивая оценка), но неясно, как работать с исходным файлом.

Есть ли какие-либо инструменты, которые каким-то образом отвечают на этот вопрос? И разумно ли пытаться добиться этого с помощью декораторов? (например, методы декорирования, которые будут выполнять поиск этого источника)

+0

'' 'Программа проходит через многие из этих классов,' '' - Вы говорите, что будет (потенциально) множество экземпляров класса, и каждому из них потребуется доступ к * тем же * данным? – wwii

+0

Существует много экземпляров класса, но каждый из них получит доступ к другому исходному файлу. –

+0

Мое предложение: не утруждайте себя собственным кэшированием в памяти, просто храните данные в ваших файлах результатов и полагайтесь на кеширование файлов вашей ОС, чтобы обеспечить быстрый доступ к этим данным. –

ответ

1

Просмотрели ли вы joblib?

Это в основном делает эти три функции:

  1. прозрачный диск-кэширование выходных значений и ленивым повторной оценки (шаблон memoize)
  2. простой простой параллельных вычислений
  3. каротажа и отслеживании исполнение

Я натолкнулся на него во время поиска n umber 2, и я рассматриваю его использование, но я вспомнил, что он также имеет memoization и кеширование как функциональность.

+0

Спасибо Aditya. Это выглядит как полезный пакет, но в конце я написал свой собственный декоратор, который использовал 'h5py'. Я большой поклонник HDF5. :-) –

+0

Достаточно честный. Спасибо, что приняли ответ. Кстати, спасибо за отличную работу над Топасом. – bastula

Смежные вопросы