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

标签 clojure file-processing

我有一个 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/

相关文章:

functional-programming - Clojure 文盲

clojure - Clojure:当我重新输入函数定义时,为什么函数的元数据会发生变化?

clojure - 使用宏和doseq来生成spec

clojure - 用 Clojure 包装

windows - Matlab加载函数超时

c++ - 如何在 C++ 中进行多线程文件处理?

clojure - 针对实际问题的命令式解决方案与功能式解决方案的好例子

python - 在 Perl 或 Python 中按列值将 100 亿行文件拆分为 5,000 个文件

c++ - 处理二进制文件 - 模板函数问题

python - 如何在 Python 中格式化输出?