Clojure:为什么这个编写器会占用这么多堆空间?

Clojure:为什么这个编写器会占用这么多堆空间?,clojure,file-processing,Clojure,File Processing,我有一个700 mb的XML文件,可以从记录树处理为EDN文件 在完成了所有的处理之后,我最终得到了一个不太大的散列映射的惰性序列(最多10个值) 要完成此操作,我想将其写入一个具有 (defn write-catalog [catalog-edn] (with-open [wrtr (io/writer "catalog-fr.edn")] (doseq [x catalog-edn] (.write wrtr (prn-str x))))) 我不理解这个问题,因为d

我有一个700 mb的XML文件,可以从记录树处理为EDN文件

在完成了所有的处理之后,我最终得到了一个不太大的散列映射的惰性序列(最多10个值)

要完成此操作,我想将其写入一个具有

(defn write-catalog [catalog-edn]
  (with-open [wrtr (io/writer "catalog-fr.edn")]
    (doseq [x catalog-edn]
      (.write wrtr (prn-str x)))))
我不理解这个问题,因为
doseq
应该不会在内存中保留序列头

我的最终输出是
catalog
类型的
clojure.lang.LazySeq

那么我会的

(write-catalog catalog)
然后,内存使用是磨磨蹭蹭的,我有一个GC开销错误,大约80mb的文件写入器,XmX为3g

我也试过使用
doseq
+
spit
和no
prn str
,同样的情况也发生了

这是正常的行为吗


感谢可能是由于
目录
值实现(谷歌“头部保留”)导致内存泄漏。当您的
write catalog
逐个实现项目时,它们会被保存在内存中(显然,您正在
def
查找
catalog
)。要解决此问题,您可以尝试避免将目录保存在变量中,而是立即将其传递给
写入目录
。比如,如果你从某个地方解析它(考虑到你前面的问题,我想这是真的),你会想做:

(编写目录(转换目录(获取目录“mycatalog.xml”))

所以巨大的中间序列不会吞噬你所有的记忆


希望有帮助。

你说得对,我忘了我注意到了这一点。如果我能很好地理解的话,只要定义了var,垃圾收集器就不能释放seq。我现在没有消耗多少内存。谢谢