假设我使用Joblib设置了memoization,如下所示(使用提供的解决方案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_1
和query_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
)的记忆,而不强制删除其他查询,该怎么办? ?
答案 0 :(得分: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()
看到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'}})