Clojure 高效的序列化:spit、out str、pr
我有一段代码如下所示:Clojure 高效的序列化:spit、out str、pr,clojure,Clojure,我有一段代码如下所示: (defn dump [path blob] (spit path (with-out-str (pr blob)))) 这是在转储GBs的数据。有没有更有效的方法?(不创建没有out str创建的中间字符串)内置序列化函数使用动态绑定变量*out*定义它们写入的位置: user> (def data [1 2 3 4 5]) #'user/data user> (with-open [output (clojure.java.io/write
(defn dump [path blob]
(spit path
(with-out-str (pr blob))))
这是在转储GBs的数据。有没有更有效的方法?(不创建没有out str创建的中间字符串)内置序列化函数使用动态绑定变量
*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
将以确保可以读回的格式写入。其他打印功能将以一种对人类更容易的方式编写,而对计算机则不保证 什么是blob
?通常我会使用pr-str
,但这无助于提高速度,因为它在内部使用而不使用str
。@Alan Thompson:“blob”是指我可以用pr写出并用clojure.edn/read-string读入的任何东西——我们不知道关于“blob”的任何其他信息