高效的序列化:spit,with-out-str,pr

时间:2016-10-24 22:46:22

标签: clojure

我有一段代码如下:

(defn dump [path blob]
  (spit path
    (with-out-str (pr blob))))

这是倾销GB的数据。有更有效的方法吗? (不创建with-out-str创建的中间字符串)?

1 个答案:

答案 0 :(得分:3)

内置的serilization函数使用动态绑定变量*out*来定义它们写入的位置:

user> (def data [1 2 3 4 5])
#'user/data

user> (with-open [output (clojure.java.io/writer "/tmp/data.edn")]
        (binding [*out* output]
          (prn data)))
nil
user> (slurp "/tmp/data.edn")
"[1 2 3 4 5]\n"

因此,如果将其绑定到文件编写器(记得关闭它,并注意延迟评估和关闭文件描述符),那么所有输出都将进入该文件。 prprn将以确保可以回读的格式编写。其他打印功能将以一种对人类更容易且不保证计算机的方式编写。