2010-04-12 19 views
13

Paralel olarak öğelerin filtrelenmesini deniyorum. Her eleman için, bir hedef noktasına yeterince yakın olup olmadığını görmek için bir mesafe hesaplaması yapmam gerekiyor. Bunu yapmak için zaten veri yapılarının mevcut olduğunu boşver, sadece şu an için ilk denemeler yapıyorum. Her neyse, rastgele vektörler ürettiğim ve onları filtrelediğim bazı çok temel deneyleri çalıştırmak istedim. İşte kod çalıştırır ve ben beklediğiniz döndüren buClojure, hesaplamalarımı gerçekleştirdikten sonra neden takılıyor?

(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)))))))) 

tüm yapar benim uygulaması var, yani yakın olan parametre n (vektörlerin uzunluğu), vektörleri (vektörlerin sayısı) ve vektörlerin sayısını ise hedef vektöre eşikten daha fazla. Anlamadığım şey, programların sonlandırmadan önce neden bir dakika daha beklemesidir. İşte

hatayı genel de bekliyoruz daha vardır içinde henüz pfilter aslında çalıştığını teyit etmediği sürece, paralel filtrelemek için nasıl

 
$ 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 

Herhangi bir yorum gösteren bir çalışma çıkışıdır.

cevap

20

pmap tarafından kullanılan threadpool desteğini alan konuları silmek için shutdown-agents numaralı telefonu aramanız gerekir.

pfilter ile ilgili olarak, çalışmanız basit olduğundan, filter'dan daha yavaş çalışmalıdır. Paralelleştirme ücretsiz değildir, bu yüzden her bir iş parçacığı, çok iş parçacıklı ek yükü dengelemek için çok yoğun görevler vermeniz gerekir. Filtrelemeden önce öğelerinizi toplayın.

+0

Ah tamam, teşekkürler. Basit mesafe sorguları için kullanamayacağım ama daha kolay bir örnek oldu. Teşekkürler. – Thomas