2014-09-23 59 views
6

說我設置記憶化與Joblib如下(使用該解決方案提供here):選擇性重新記憶化

from tempfile import mkdtemp 
cachedir = mkdtemp() 

from joblib import Memory 
memory = Memory(cachedir=cachedir, verbose=0) 

@memory.cache 
def run_my_query(my_query) 
    ... 
    return df 

而且說我定義了幾個疑問,query_1query_2的,他們都採取了長時間運行。

我的理解是,與代碼,因爲它是:

  • 第二通話,無論是查詢,將使用memoized輸出,即:

    run_my_query(query_1) 
    run_my_query(query_1) # <- Uses cached output 
    
    run_my_query(query_2) 
    run_my_query(query_2) # <- Uses cached output 
    
  • 我可以使用memory.clear()刪除整個緩存目錄

但是如果我想要重做備忘只有一個查詢(例如, query_2)而不強制刪除另一個查詢?

+4

似乎['.call'](https://pythonhosted.org/joblib/memory.html#joblib.memory.MemorizedFunc.call)_forces_計算。你可能想檢查它是否更新緩存。 – 2014-09-23 15:04:57

+0

@ behzad.nouri偉大的指針!我希望有這樣的方法。我查找了關鍵字'force',但沒有找到任何東西。 '.call'可能是答案。我會查一下。 – 2014-09-23 15:06:49

+0

@ behzad.nouri看着[代碼](https://github.com/joblib/joblib/blob/master/joblib/memory.py#L665-L682),它似乎調用'persist_output',所以我認爲它將做的伎倆! – 2014-09-23 15:10:10

回答

4

看起來像庫不支持緩存的部分擦除。

您可以緩存,functino分成兩對:

from tempfile import mkdtemp 
from joblib import Memory 

memory1 = Memory(cachedir=mkdtemp(), verbose=0) 
memory2 = Memory(cachedir=mkdtemp(), verbose=0) 

@memory1.cache 
def run_my_query1() 
    # run query_1 
    return df 

@memory2.cache 
def run_my_query2() 
    # run query_2 
    return df 

現在,你可以有選擇地清除緩存:

memory2.clear() 

UPDATE看到behzad.nouri的評論後:

您可以使用call裝飾功能的方法。但正如你在下面的例子中看到的那樣,返回值與普通調用不同。你應該照顧它。

>>> import tempfile 
>>> import joblib 
>>> memory = joblib.Memory(cachedir=tempfile.mkdtemp(), verbose=0) 
>>> @memory.cache 
... def run(x): 
...  print('called with {}'.format(x)) # for debug 
...  return x 
... 
>>> run(1) 
called with 1 
1 
>>> run(2) 
called with 2 
2 
>>> run(3) 
called with 3 
3 
>>> run(2) # Cached 
2 
>>> run.call(2) # Force call of the original function 
called with 2 
(2, {'duration': 0.0011069774627685547, 'input_args': {'x': '2'}}) 
+0

我希望能夠運行幾十個查詢,所以這可能無法擴展,但是謝謝,這很有幫助。 – 2014-09-23 15:05:47

+1

@ user815423426,看到behzad.nouri的評論後,我更新了答案。來自作者的 – falsetru 2014-09-23 15:12:12

+0

[此評論](https://twitter.com/GaelVaroquaux/status/562735568346689536)爲此增加了更多的亮點。 – 2015-02-04 00:05:48