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
应该不会在内存中保留序列的头部。
我的最终输出 catalog
是 clojure.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")))
这么大的中间序列不会吃掉你所有的内存
希望对您有所帮助。
我有一个 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
应该不会在内存中保留序列的头部。
我的最终输出 catalog
是 clojure.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")))
这么大的中间序列不会吃掉你所有的内存
希望对您有所帮助。