【发布时间】:2010-04-12 14:22:56
【问题描述】:
我正在尝试并行过滤元素。对于每个元素,我需要执行距离计算,看看它是否足够接近目标点。别介意已经存在用于执行此操作的数据结构,我现在只是在做初步实验。
无论如何,我想进行一些非常基本的实验,在这些实验中生成随机向量并对其进行过滤。这是我完成所有这些的实现
(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 [空] 10 100000 12283 [null] “经过时间:3300.856 毫秒” 真正的 1m6.336s 用户 0m7.204s 系统 0m1.495s任何关于如何并行过滤的 cmets 也非常受欢迎,因为我还没有确认 pfilter 确实有效。
【问题讨论】:
标签: clojure parallel-processing