Clojure:为什么这位作家会消耗这么多堆空间?

时间:2016-05-23 14:33:25

标签: 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)))))

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

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

然后我做

(write-catalog catalog)

然后内存使用正在磨损,我有一个GC开销错误,大约80mb的文件写入,XmX为3g。

我还尝试了doseq + spit而没有prn-str,同样的事情发生了。

这是正常行为吗?

由于

1 个答案:

答案 0 :(得分:2)

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

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

如此巨大的中间序列不会占用你所有的记忆

希望它有所帮助。