2010-04-12 29 views
13

我正在尝试通过并行的元素进行过滤。对于每个元素,我需要执行距离计算以查看它是否足够接近目标点。不必介意这样做的数据结构已经存在,我现在只是做初步实验。为什么Clojure在完成我的计算后挂起?

无论如何,我想运行一些非常基本的实验,在这里我生成随机向量并过滤它们。下面是我的实现,做这一切

(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

您需要致电shutdown-agents以终止pmap使用的线程池支持的线程。

pfilter,它应该工作,但运行速度比filter慢,因为你的谓词很简单。并行不是免费的,所以你必须给每个线程适度密集的任务来抵消多线程开销。在过滤之前批量处理它们。

+0

啊好的,谢谢。我真的不会用它来进行简单的距离查询,但这是一个更简单的例子。谢谢。 – Thomas 2010-04-12 15:48:35

相关问题