lru_cache дамп в файл и повторная загрузка обратно в память

В пакете functools в Python3 есть декоратор lru_cache(), который запоминает ваши вызовы функций.

Есть ли способ выгрузить этот кеш в файл, а затем загрузить файл обратно в память позже?

Я не смог найти эту функцию в документации functools. Каков был бы рекомендуемый способ достижения вышеуказанных требований, желательно с решением, включающим только Python?


person Spinor8    schedule 02.03.2016    source источник
comment
возможный дубликат: stackoverflow.com/questions/15585493/   -  person MaxU    schedule 02.03.2016


Ответы (1)


Я не знаю стандартного способа решить эту проблему. Но вы можете написать свою аннотацию следующим образом:

def diskcached(cachefile, saveafter=1):
    def cacheondisk(fn):
        try:
            with open(cachefile, 'rb') as f:
                cache = pickle.load(f)
        except:
            cache = {}
        unsaved = [0]

        @wraps(fn)
        def usingcache(*args, **kwargs):
            try:
                key = hash((args, kwargs))
            except TypeError:
                key = repr((args, kwargs))
            try:
                ret = cache[key]
            except KeyError:
                ret = cache[key] = fn(*args, **kwargs)
                unsaved[0] += 1
                if unsaved[0] >= saveafter:
                    with open(cachefile, 'wb') as f:
                        pickle.dump(cache, f)
                    unsaved[0] = 0
            return ret

        return usingcache

    return cacheondisk

и использовать с

@diskcached("filename_to_save")
def your_function():
    ...
person MAXbrainRUS    schedule 20.08.2016