我想了解一個惰性序列的行爲,如果我迭代doseq
但保留第一個元素的一部分。line-seq的行爲是什麼?
(with-open [log-file-reader (clojure.java.io/reader (clojure.java.io/file input-file-path))]
; Parse line parse-line returns some kind of representation of the line.
(let [parsed-lines (map parse-line (line-seq log-file-reader))
first-item (first parsed-lines)]
; Iterate over the parsed lines
(doseq [line parsed-lines]
; Do something with a side-effect
)))
我不想保留任何列表,我只是想對每個元素執行一個副作用。我相信沒有first-item
就沒有問題了。
我在我的程序中遇到了內存問題,我認爲在parsed-line
序列的開始部分可能保留對某些內容的引用意味着存儲了整個序列。
這是什麼定義的行爲?如果正在存儲序列,是否有一種通用的方法來獲取對象的副本並使序列的已實現部分被垃圾收集?
僅供參考我正在處理多千兆字節的文件。你是說,即使是懶惰地生產和消費,let也保留了序列?我應該使用什麼語法來完成上述操作?我剛剛重新編寫了一個循環+在seq-seq尾部重複使用,並且RAM使用量明顯更小。但它看起來不那麼好。有沒有一種方法可以在沒有序列控制的情況下得到一張懶惰評估過的地圖? – Joe
不需要回答,如果你不想,我意識到綁定是在cons-cell-type-element而不是「整個懶惰序列」上。我應該這樣做的方式是將'parsed-lines'放入'doseq'綁定中。 – Joe
編譯器應在最後一次引用時釋放'parsed-lines',即doseq開始時。這裏發佈的代碼不需要大量的內存,除非註釋掉的行也指向大型的懶惰序列。 – amalloy