gpt4 book ai didi

clojure - 为什么 Clojure 在执行计算后挂起?

转载 作者:行者123 更新时间:2023-12-02 11:56:42 25 4
gpt4 key购买 nike

我正在尝试并行过滤元素。对于每个元素,我需要执行距离计算以查看它是否足够接近目标点。不要介意已经存在用于执行此操作的数据结构,我现在只是在进行初步实验。

无论如何,我想运行一些非常基本的实验,生成随机向量并过滤它们。这是我的实现,完成了所有这些

(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.336suser    0m7.204ssys 0m1.495s

任何有关如何并行过滤的评论也非常受欢迎,因为我尚未确认 pfilter 确实有效。

最佳答案

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

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

关于clojure - 为什么 Clojure 在执行计算后挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2622750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com