Я хотел бы понять поведение ленивой последовательности, если я перебираю doseq
, но удерживаю часть первого элемента.Каково будет поведение линии-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
означает, что вся последовательность сохранена.
Какое здесь поведение? Если последовательность хранится, существует ли общий способ взять копию объекта и включить реализованную часть последовательности для сбора мусора?
FYI Я имею дело с файлами с несколькими гигабайтами. Вы говорите, что «пусть» сохраняет последовательность, даже если ее лениво производят и потребляют? Какой синтаксис я должен использовать, чтобы сделать это выше? Я только что переписал это с помощью цикла + recur на хвосте линии-seq, и использование ОЗУ было значительно меньше. Но это выглядит не так хорошо. Есть ли способ получить лениво оцененную карту в объеме без seq-hold? – Joe
Не нужно отвечать, если вы этого не хотите, я понял, что привязка - это элемент cons-cell-type, а не «ленивая последовательность в целом». То, как я должен был это сделать, заключалось в том, чтобы поместить 'parsed-lines' в обязательную привязку. – Joe
Компилятор должен выпустить 'parsed-lines' здесь, как только он ссылается последним, т.е. когда начинается доза. Код, размещенный здесь, не требует большой памяти, если только строки с комментариями не относятся к большой ленивой последовательности. – amalloy