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
시퀀스의 시작 부분에있는 참조를 유지하면 전체 시퀀스가 저장된다는 것을 의미한다고 생각합니다.
정의 된 동작은 무엇입니까? 시퀀스가 저장되는 경우 객체의 복사본을 가져 와서 시퀀스의 실현 된 부분을 가비지 수집 할 수있는 일반적인 방법이 있습니까?
참고 : 저는 멀티 기가 바이트 파일을 다루고 있습니다. lazily가 생산되고 소비 되더라도'let '이 서열을 유지한다고 말하는 겁니까? 위의 작업을 수행하려면 어떤 구문을 사용해야합니까? 나는 loop-seq의 꼬리 부분에 loop + recur를 써서 이것을 다시 작성했다. 그리고 RAM 사용은 상당히 작다. 그러나 그것은 거의 멋지지 않게 보입니다. seq-holding하지 않고도 lazily-evaluate지도를 얻는 방법이 있습니까? – Joe
그럴 필요가 없다고 대답 할 필요가 없다면 바인딩이 '전체로서의 게으른 시퀀스'가 아닌 cons-cell-type 요소에 있다는 것을 깨달았습니다. 필자가해야 할 일은'파싱 된 라인'을'doseq' 바인딩에 넣는 것이었다. – Joe
컴파일러는 마지막으로 참조되는 즉시, 즉 doseq가 시작될 때'파싱 된 라인 '을 여기에서 해제해야합니다. 주석이 달린 행이 커다란 게으른 순서를 참조하지 않는 한 여기에 게시 된 코드는 많은 메모리를 필요로하지 않습니다. – amalloy