我有一段代码如下:
(defn dump [path blob]
(spit path
(with-out-str (pr blob))))
这是倾销GB的数据。有更有效的方法吗? (不创建with-out-str创建的中间字符串)?
答案 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"
因此,如果将其绑定到文件编写器(记得关闭它,并注意延迟评估和关闭文件描述符),那么所有输出都将进入该文件。 pr
和prn
将以确保可以回读的格式编写。其他打印功能将以一种对人类更容易且不保证计算机的方式编写。