DataFrames的选择性重新记忆

时间:2014-09-23 14:56:31

标签: python pandas joblib

假设我使用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_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)的记忆,而不强制删除其他查询,该怎么办? ?

1 个答案:

答案 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'}})