clojure - 如何并行减少 Clojure 序列

标签 clojure parallel-processing

我有一个未排序的 map 序列(电视节目)需要合并,这意味着生成的序列基于特殊键(:标题)是唯一的,并且其他键与重复项合并。可以将其视为将特定电视节目的所有放映合并到一个包含有关它们的所有信息的单个条目中。

程序看起来像这样(简化):

[{:prog {:title "", ...} :starts #{} :directors #{} :actors #{} :categories {}}, ...]

这是我当前执行合并的函数:

(defn- merge-programs [all-programs]
    "Merge all instances of the same program"
    (loop [acc      []
           programs all-programs]
        (if (empty? programs)
            acc
            (let [first-prog  (first programs)
                  dups        (filter #(= (:title first-prog) (:title (:prog %))) programs)
                  merged-prog {:prog       first-prog
                               :starts     (apply set/union (map :starts     dups))
                               :directors  (apply set/union (map :directors  dups))
                               :actors     (apply set/union (map :actors     dups))
                               :categories (apply set/union (map :categories dups))}]
                (recur (conj acc merged-prog)
                       (remove #(= (:title first-prog) (:title (:prog %)))) programs))))))

我正在尝试找出如何并行进行合并。但是,由于在循环的每次迭代之后,开始序列的“随机”元素都被删除,因此必须采用某种分而治之的方法。

关于如何做到这一点有什么想法吗?

最佳答案

Reducers Clojure 1.5 中的功能正是您想要的。

关于clojure - 如何并行减少 Clojure 序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14901719/

相关文章:

clojure - 带联合的查询组合如何与通过 Om Next 中的 props 传递的父子树配合使用

clojure - 解释 Clojure 符号

c - 有些线程计算正确,有些则不正确

c# - .NET 4.5 并行处理和 for 循环

CUDA - 埃拉托色尼筛分法

clojure - clojure中的最大子数组算法

curl - Clojure:读取 CSV 文件并将列值传递给curl

c++ - #pragma omp parallel 和 #pragma omp parallel for 之间的区别

c - 为什么这段与 OpenMP 并行化的代码不能正常工作?

macros - 使用宏绑定(bind) getter 和 setter