2012-09-20 80 views
2

我在課堂上使用這個memoize裝飾器,它非常有效。現在我準備交易一些速度來控制內存消耗。理想情況下,我可以設置最大值; (例如:2GB),但我想我可以嘗試和錯誤很多,並解決緩存中的最大數量的對象。如何將最大緩存大小應用於記憶?

任何人都知道一些現成的代碼做到這一點?我想我會拋出緩存中最老的來添加最新的。

還是有一個更明智的方式來做到這一點?

這裏是我目前使用的程序:

def memoize(obj): 
    """A decorator to cache advice objects using the advice key""" 
    cache = obj.cache = {} 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     key = args[0] 
     if key not in cache: 
      cache[key] = obj(*args, **kwargs) 
     return cache[key] 

    return memoizer 

似乎是合理的給予最高爲ARG像裝飾:

@memoize(max=2000) 
class Foo(object): 
    ... 
+0

如果您的對象具有不同的大小,那麼可能很難估計緩存佔用的內存空間。如果你不能指望最後使用的對象可能會被重用,那麼最好的策略可能是將第一個xxx對象保存在內存中 –

回答

6

如果你正在使用Python 3.2時,已經是在標準庫中一個很好的緩存裝飾:否則

import functools 

@functools.lru_cache(maxsize=1000) 
def fun(...): 

,我只是看看的lru_cache實施。這是一個很好的具有LRU語義的純Python通用備忘錄(就像你使用的FIFO語義,但有點複雜),以獲得更好的緩存性能。

+1

在這裏找到2.6+版本:http://code.activestate.com/recipes/578078/ –

1

如果是我我可能會做這樣的事情:

from collections import deque 

def memoize(obj, maxlen = None): 
    """A decorator to cache advice objects using the advice key""" 
    cache = obj.cache = {} 
    deck = obj.deck = deque([], maxlen = maxlen) 

    @functools.wraps(obj) 
    def memoizer(*args, **kwargs): 
     key = args[0] 
     if key not in cache: 
      if len(deck) == deck.maxlen: 
       del cache[deck.popleft()[0]] 
      temp = obj(*args, **kwargs) 
      cache[key] = temp 
      deck.append((key, temp)) 
     return cache[key] 

    return memoizer 

這應該是接近,但我寫在編輯器這裏,而不是在提示。它可能需要一些改進。