clojure - 计算文件夹大小

标签 clojure agent

我正在尝试并行计算文件夹大小。
也许这是天真的方法。
我所做的是将每个分支节点(目录)的计算提供给代理。
所有叶节点都将其文件大小添加到 my-size。
好吧,它不起作用。 :)

“扫描”工作正常,串行。
'pscan' 只打印第一级的文件。

(def agents (atom []))
(def my-size (atom 0))
(def root-dir (clojure.java.io/file "/"))

(defn scan [listing]
  (doseq [f listing]
    (if (.isDirectory f)
      (scan (.listFiles f))
      (swap! my-size #(+ % (.length f))))))

(defn pscan [listing]
  (doseq [f listing]
    (if (.isDirectory f)
      (let [a (agent (.listFiles f))]
        (do (swap! agents #(conj % a))
            (send-off a pscan)
            (println (.getName f))))
    (swap! my-size #(+ %  (.length f))))))

你有什么想法,我做错了什么?

谢谢。

最佳答案

无需使用原子保持状态。纯函数式:

(defn psize [f]
  (if (.isDirectory f)
    (apply + (pmap psize (.listFiles f)))
    (.length f)))

关于clojure - 计算文件夹大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5871493/

相关文章:

clojure - 如何获取 clojure 函数参数的元数据?

Clojure(读行)不等待输入

linux - 在 CentOS 7 上安装 puppet

clojure - Clojure的 "send"是异步的吗?

Clojure:如何忽略可能从表达式中抛出的异常?

java - ClassNotFoundException 与 java 代理 (-javaagent :jarpath)

tfs - 定义 TFS 构建定义依赖性和顺序

linux - 混淆 ns2 : agents classifiers and nodes

f# 邮箱处理器 - 无需等待发送即可回复

string - Clojure 中将字符串转换为整数向量的功能解决方案