2014-09-23 10 views
6
Joblib इस प्रकार के साथ

कहते हैं कि मैं सेटअप Memoization (का उपयोग कर समाधान here प्रदान की गई):चयनात्मक DataFrames की पुन: Memoization

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 के एक जोड़े को परिभाषित, उन दोनों एक ले चलाने के लिए लंबा समय।

मैं समझता हूँ कि, के रूप में यह है कोड के साथ:

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 
  • मैं इस्तेमाल कर सकते हैं:

    • दूसरा या तो क्वेरी के साथ कॉल, memoized उत्पादन, यानी प्रयोग करेंगे memory.clear() पूरे कैश निर्देशिका को हटाने के लिए

    लेकिन अगर मैं री-डूके लिए ज्ञापन (उदा। query_2) अन्य क्वेरी पर एक डिलीट मजबूर किए बिना?

  • +4

    गणना _forces_ लगता है कि [ '.call'] (https://pythonhosted.org/joblib/memory.html#joblib.memory.MemorizedFunc.call)। आप यह जांचना चाहेंगे कि यह कैश को भी अपडेट करता है या नहीं। –

    +0

    @ behzad.nouri महान सूचक! मैं इस तरह की एक विधि की उम्मीद कर रहा था। मैंने कीवर्ड 'फोर्स' की तलाश की लेकिन कुछ भी नहीं मिला। '.call' जवाब हो सकता है। मैं इसकी जांच करूंगा। –

    +0

    @ behzad.nouri [कोड] (https://github.com/joblib/joblib/blob/master/joblib/memory.py#L665-L682) को देखकर, ऐसा लगता है कि 'persist_output' को कॉल करें, इसलिए मुझे लगता है कि यह चाल चलेंगे! –

    उत्तर

    4

    ऐसा लगता है कि लाइब्रेरी कैश के आंशिक मिटा का समर्थन नहीं करती है।

    आप दो जोड़े में कैश, functino अलग कर सकते हैं: behzad.nouri की टिप्पणी को देखने के बाद

    memory2.clear() 
    

    अद्यतन:

    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 
    

    अब, आप चुनिंदा कैश साफ़ कर सकते

    आप सजाए गए फ़ंक्शन की 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

    मैं रन दर्जनों प्रश्नों का उपयोग करने की उम्मीद कर रहा हूं, इसलिए यह स्केल नहीं हो सकता है, लेकिन धन्यवाद, यह सहायक है। –

    +1

    @ user815423426, behzad.nouri की टिप्पणी देखने के बाद, मैंने जवाब अपडेट किया। लेखक से – falsetru

    +0

    [यह टिप्पणी] (https://twitter.com/GaelVaroquaux/status/562735568346689536) लेखक से अधिक प्रकाश जोड़ता है। –

    संबंधित मुद्दे