2012-03-12 13 views
6

में प्री-समेकित डेटास्ट्रक्चर ओलाप-क्यूब्स में समेकित डेटा की बड़ी मात्रा में बहुत तेज़ी से दिखना संभव है। इसका मुख्य कारण यह है कि संचालन में डेटा को पूर्व-समेकित किया जाता है जो ऊपर (मुख्य रूप से +, -, माध्य, std, max, min और कुछ और) को गठबंधन करना आसान होता है।क्लोजर

क्लोजर में इस "विरोधी आलसी" व्यवहार को कैसे प्राप्त करें?

मैं कैसे इस तरह एक आंकड़ा संरचना को अद्यतन करने और सुनिश्चित करें कि एक इकाई के माता-पिता भी अपडेट कर

(def world-population {:africa 4e8   ;;this is an aggregation! 
         :africa/liberia 3.4e6 
         :africa/ethiopia 7.4e7 
         ...}) 

की तरह कुछ पर सोच रहा हूँ? क्या किसी को अपना स्वयं का पुन: कार्यान्वयन करना है?

उत्तर

3

तुम एक उच्च आदेश समारोह के रूप में एक पुनरावर्ती रोलअप समारोह लिख सकता है, की तरह कुछ:

(defn rollup 
    ([data heirarchy func] 
    (loop [top (second (first heirarchy))] 
     (if (nil? (heirarchy top)) 
     (rollup data heirarchy func top) 
     (recur (heirarchy top))))) 
    ([data heirarchy func root] 
    (let [children (reduce (fn [l [k v]] (if (= v root) (cons k l) l)) '() heirarchy) 
      data (reduce (fn [d c] (if (d c) d (rollup d heirarchy func c))) data children) 
      child-values (map data children)] 
     (assoc data root (apply func child-values))))) 

कौन सा तो किसी विशेष रोलअप ऑपरेशन या पदानुक्रम के साथ इस्तेमाल किया जा सकता आप की तरह:

(def populations { :africa/liberia 3.4e6 
        :africa/ethiopia 7.4e7}) 

(def geography {:africa/liberia :africa 
       :africa/ethiopia :africa 
       :africa :world}) 

(rollup populations geography +) 
=> {:africa   7.74E7, 
    :world   7.74E7, 
    :africa/ethiopia 7.4E7, 
    :africa/liberia 3400000.0} 

जाहिर है यदि आपके पास बहुत बड़े डेटा सेट या एकाधिक पदानुक्रम आदि हैं तो यह अधिक जटिल हो जाता है, लेकिन यह कई सरल मामलों के लिए पर्याप्त होना चाहिए।

+0

यह कमाल है! उच्च-आदेश कार्यों का उपयोग करने का चालाक तरीका! भूगोल शायद प्राप्त करने के लिए एक अच्छा मैच होगा, उस के साथ और अधिक प्रयास करेंगे। – claj

4

एक परमाणु में अपने डेटा भंडारण करके, आप घड़ियों जोड़ सकते हैं - अनिवार्य रूप से कॉलबैक जब परमाणु अद्यतन किया जाता है

कुछ इस तरह:

(def world-population (atom {:africa 4e8 
          :africa/liberia 3.4e6 
          ...})) 

(add-watch word-population :population-change-key 
     (fn [key ref old new] 
     (prn "population change"))) 

आप उसके ऊपर कुछ घटना प्रचार तर्क बना सकते हैं ।

+0

ऐड-घड़ी संरचना को सिंक में रखने के लिए एक चालाक तरीका है! उस के लिए धन्यवाद! – claj