Clojure:为什么这个作者消耗了这么多堆space?

Clojure : why does this writer consume so much heap space?

我有一个 700 MB XML 文件,我将其从记录树处理为 EDN 文件。

在完成所有处理后,我终于得到了一个不是特别大(最多 10 个值)的惰性 hashmap 序列。

最后,我想用

将它写入一个文件
(defn write-catalog [catalog-edn]
  (with-open [wrtr (io/writer "catalog-fr.edn")]
    (doseq [x catalog-edn]
      (.write wrtr (prn-str x)))))

我不明白这个问题,因为 doseq 应该不会在内存中保留序列的头部。

我的最终输出 catalogclojure.lang.LazySeq 类型。

然后我

(write-catalog catalog)

然后内存使用量越来越大,我在大约 80mb 的文件写入器中遇到了 GC 开销错误,XmX 为 3g。

我也试过 doseq + spit 但没有 prn-str,同样的事情发生了。

这是正常行为吗?

谢谢

可能由于 catalog 值实现 (google "head retention") 而导致内存泄漏。当您的 write-catalog 一件一件地实现项目时,它们将保存在内存中(显然您正在 def'fing catalog 某处)。要解决此问题,您可以尝试避免将目录保存在变量中,而是立即将其传递给 write-catalog。就像你从某个地方解析它一样(我想这是真的,考虑到你之前的问题),你会想要做:

(write-catalog (transform-catalog (get-catalog "mycatalog.xml")))

这么大的中间序列不会吃掉你所有的内存

希望对您有所帮助。