如何在klepto的磁盘上使用LRU缓存?

时间:2015-08-18 19:37:46

标签: klepto

我正在尝试使用klepto来进行LRU缓存。我想将缓存存储到磁盘,目前我正在使用klepto的dir_archive选项。我编写了以下代码,主要基于klepto测试脚本中的代码:

def mymap(data):
    return hashlib.sha256(data).hexdigest()

class MyLRUCache:
    @lru_cache(cache=dir_archive(cached=False), keymap=mymap, ignore='self', maxsize=5)
    def __call__(self, data)
        return data

    call = __call__

    def store(self, data):
        self.call(data)

    # I would also appreciate a better way to do this, if possible.
    def lookup(self, key):
        return self.call.__cache__()[key]

此代码似乎正常工作,直到缓存达到maxsize。此时,lru_cache清除整个缓存,而不是使用LRU删除单个项目!下面是执行此操作的klepto源代码(https://github.com/uqfoundation/klepto/blob/master/klepto/safe.py):

# purge cache
if _len(cache) > maxsize:
    if cache.archived():
        cache.dump()
        cache.clear() 
        queue.clear()
        refcount.clear()
     else: # purge least recently used cache entry
        key = queue_popleft()
        refcount[key] -= 1
        while refcount[key]:
            key = queue_popleft()
            refcount[key] -= 1
        del cache[key], refcount[key]

所以我的问题是,为什么klepto清除"存档"高速缓存?是否可以同时使用lru_cachedir_archive

另外,如果我的代码看起来完全疯了,我会非常感谢我应该写这个的示例代码,因为没有太多关于klepto的文档。

其他说明: 我还尝试使用dir_archive定义cached=True。当达到maxsize时,内存缓存仍会被清除,但缓存的内容将在此时转储到存档缓存中。我有几个问题:

  1. 内存缓存仅在达到maxsize之前才准确,此时它将被擦除。
  2. 归档缓存不受maxsize的影响。每次内存缓存都达到maxsize时,内存缓存中的所有项都将转储到存档缓存中,无论已存在多少项。
  3. 基于第1点和第2点,LRU缓存似乎不可能。

0 个答案:

没有答案