2010-04-12 9 views
13

मैं समांतर में तत्वों के माध्यम से फ़िल्टरिंग के साथ प्रयोग कर रहा हूं। प्रत्येक तत्व के लिए, मुझे यह देखने के लिए दूरी गणना करने की आवश्यकता है कि यह लक्ष्य बिंदु के लिए पर्याप्त है या नहीं। इस बात को ध्यान में रखें कि डेटा संरचनाएं पहले से ही ऐसा करने के लिए मौजूद हैं, मैं अभी के लिए प्रारंभिक प्रयोग कर रहा हूं।क्लोजर मेरी गणना करने के बाद क्यों लटका है?

वैसे भी, मैं कुछ बहुत ही बुनियादी प्रयोगों को चलाने के लिए चाहता था जहां मैं यादृच्छिक वैक्टर उत्पन्न करता हूं और उन्हें फ़िल्टर करता हूं। यहाँ मेरी कार्यान्वयन है कि इस

(defn pfilter [pred coll] 
    (map second 
    (filter first 
     (pmap (fn [item] [(pred item) item]) coll)))) 

(defn random-n-vector [n] 
    (take n (repeatedly rand))) 

(defn distance [u v] 
    (Math/sqrt (reduce + (map #(Math/pow (- %1 %2) 2) u v)))) 

(defn -main [& args] 
    (let [[n-str vectors-str threshold-str] args 
     n (Integer/parseInt n-str) 
     vectors (Integer/parseInt vectors-str) 
     threshold (Double/parseDouble threshold-str) 
     random-vector (partial random-n-vector n) 
     u (random-vector)] 
    (time (println n vectors 
     (count 
     (pfilter 
      (fn [v] (< (distance u v) threshold)) 
      (take vectors (repeatedly random-vector)))))))) 

कोड निष्पादित करता है और देता है मैं क्या उम्मीद के सभी करता है, उस पैरामीटर n (वैक्टर की लंबाई), वैक्टर (वैक्टर की संख्या) और वैक्टर की संख्या कि करीब हैं है लक्ष्य वेक्टर के लिए एक सीमा से। जो मुझे समझ में नहीं आता है, वह प्रोग्राम समाप्त होने से पहले एक अतिरिक्त मिनट के लिए क्यों लटकता है।

यहाँ जो त्रुटि दर्शाता है

 
$ time lein run 10 100000 1.0 
    [null] 10 100000 12283 
    [null] "Elapsed time: 3300.856 msecs" 

real 1m6.336s 
user 0m7.204s 
sys 0m1.495s 

कैसे समानांतर में फिल्टर करने के लिए में सामान्य भी स्वागत की तुलना में अधिक कर रहे हैं, जैसा कि मैंने अभी तक पुष्टि नहीं की है कि pfilter वास्तव में काम करता है पर किसी भी टिप्पणी एक रन का उत्पादन होता है।

उत्तर

20

आपको pmap द्वारा उपयोग किए गए थ्रेडपूल का समर्थन करने वाले धागे को मारने के लिए shutdown-agents पर कॉल करने की आवश्यकता है।

लगभग pfilter, यह काम करना चाहिए, लेकिन filter से धीमी गति से चलाना चाहिए, क्योंकि आपकी भविष्यवाणी सरल है। समांतरता मुक्त नहीं है इसलिए आपको मल्टीथ्रेडिंग ओवरहेड को ऑफ़सेट करने के लिए प्रत्येक थ्रेड को सामान्य रूप से गहन कार्य देना होगा। उन्हें फ़िल्टर करने से पहले अपने आइटम बैच करें।

+0

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

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