我有一个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
,同样的事情发生了。
这是正常行为吗?
由于
答案 0 :(得分:2)
由于catalog
值实现(谷歌“头部保留”),内存可能会泄漏。当您的write-catalog
逐个实现项目时,它们会被保存在内存中(显然您在某处def
'fing catalog
。要解决此问题,您可以尝试避免将目录保存在变量中,而是立即将其传递给write-catalog
。就像你从某个地方解析它(我想这是真的,考虑到你之前的问题),你会想做:
(write-catalog (transform-catalog (get-catalog "mycatalog.xml")))
如此巨大的中间序列不会占用你所有的记忆
希望它有所帮助。