在Clojure中迭代惰性序列的惯用方法是什么?

在Clojure中迭代惰性序列的惯用方法是什么?,clojure,io,lazy-evaluation,Clojure,Io,Lazy Evaluation,我有以下函数来处理具有恒定内存使用量的大文件 (defn lazy-helper "Processes a java.io.Reader lazily" [reader] (lazy-seq (if-let [line (.readLine reader)] (cons line (lazy-helper reader)) (do (.close reader) nil)))) (

我有以下函数来处理具有恒定内存使用量的大文件

(defn lazy-helper
    "Processes a java.io.Reader lazily"
    [reader]
    (lazy-seq
          (if-let [line (.readLine reader)]
                  (cons line (lazy-helper reader))
                  (do (.close reader) nil))))
(defn lazy-lines
    "Return a lazy sequence with the lines of the file"
    [^String file]
    (lazy-helper (io/reader file)))
当处理部分进行过滤或其他映射或减少操作时,这种方法非常有效,可以很好地处理惰性序列

当我处理文件,例如通过通道将每一行发送到工作进程时,问题就开始了

(thread
  (doseq [line lines]
    (blocking-producer work-chan line)))

这样做的明显缺点是急于处理文件,导致堆溢出

我想知道迭代文件中的每一行并对这些行执行IO的最佳方式是什么

似乎这可能与文件IO的处理方式无关,doseq不应该抓住读卡器的头部

正如@joost diepenmaat指出的,这可能与文件IO无关,他是对的


我处理JSON序列化和反序列化的方式似乎是根本原因。

您可以使用它“将rdr中的文本行作为延迟字符串序列返回”。

这原来是代码的JSON处理问题,而不是文件IO的问题。原始帖子中的解释。

“明显的缺点是处理文件会导致堆溢出。”为什么会出现这种情况?另外:
行seq
是一个内置项。@JoostDiepenmaat不确定我是否错了。我正在启用Java任务控制并检查正在发生的事情。