如何并行减少Clojure序列

时间:2013-02-15 19:13:30

标签: clojure parallel-processing

我有一个未分类的地图序列(电视节目),我需要合并,这意味着结果序列基于特殊键(:标题)是唯一的,其他键与重复项合并。可以把它想象成将特定电视节目的所有放映合并为一个包含所有相关信息的条目。

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

[{: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))))))

我正在试图弄清楚如何并行执行此合并。但是,因为在循环的每次迭代之后,开始序列的“随机”元素被移除,所以它必须是一些分而治之的方法。

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:3)

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