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
实际工作的任何意见。
啊好的,谢谢。我真的不会用它来进行简单的距离查询,但这是一个更简单的例子。谢谢。 – Thomas 2010-04-12 15:48:35