我有一个 700 MB 的 XML 文件,我将其从记录树处理为 EDN 文件。
完成所有处理后,我终于得到了一个不是特别大的惰性 HashMap 序列(最多 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)
然后内存使用量非常大,我在 XmX 为 3g 的文件写入器大约 80mb 时出现 GC 开销错误。
我也尝试过使用doseq
+ spit
并且没有prn-str
,同样的事情发生了。
这是正常行为吗?
谢谢
最佳答案
可能是由于catalog
值实现导致内存泄漏(谷歌“头部保留”)。当您的write-catalog
逐一实现项目时,它们将保存在内存中(显然您正在def
'fingcatalog
某处)。要解决此问题,您可以尝试避免将目录保留在变量中,而是立即将其传递给write-catalog
。就像如果你从某个地方解析它(考虑到你之前的问题,我猜这是真的),你会想要这样做:
(write-catalog (transform-catalog (get-catalog "mycatalog.xml")))
如此巨大的中间序列不会耗尽你所有的内存
希望有帮助。
关于Clojure : why does this writer consume so much heap space?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37393825/