【问题标题】:Why does Clojure hang after having performed my calculations?为什么 Clojure 在执行我的计算后会挂起?
【发布时间】: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


    【解决方案1】:

    您需要调用shutdown-agents 来终止支持pmap 使用的线程池的线程。

    关于pfilter,它应该可以工作,但运行速度比filter 慢,因为您的谓词很简单。并行化不是免费的,因此您必须为每个线程分配适度密集的任务以抵消多线程开销。在过滤之前对您的项目进行批处理。

    【讨论】:

    • 啊,好的,谢谢。我不会真的将它用于简单的距离查询,但这是一个更简单的例子。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2021-06-09
    相关资源
    最近更新 更多