如何计算一个非常大的惰性序列中的元素数量?

Pun*_*aik 0 memory clojure out-of-memory large-data lazy-sequences

我有以下(非常大)lazy-seq

(def lazy-list (partition-all 100000 (take 10000000000000000000 (repeat 1))))
Run Code Online (Sandbox Code Playgroud)

我想计算其中的元素数量,为此我正在执行以下操作:

(time
  (loop [ll lazy-list
         c 0]
    (if-not (seq (take 1 ll))
      c
      (recur (drop 1 ll)
             (inc c)))))
Run Code Online (Sandbox Code Playgroud)

如果我运行这个,我会收到以下错误:

Execution error (OutOfMemoryError) at user/eval2043$fn (REPL:1).
Java heap space
Run Code Online (Sandbox Code Playgroud)

但如果我没有持有head任何地方,为什么我会看到这个OOM问题?

Sha*_*nce 5

但如果我没有把头放在任何地方......?序列的头部由 持有lazy-list