Tôi đang cố gắng lấy 5 dòng theo số dòng của chúng từ một tệp lớn (> 1GB) với Clojure. Tôi gần như ở đó nhưng đang thấy một số điều kỳ lạ, và tôi muốn hiểu những gì đang xảy ra.Trích xuất một cách dễ dàng các dòng từ tệp lớn
Cho đến nay tôi đã có:
(defn multi-nth [values indices]
(map (partial nth values) indices))
(defn read-lines [file indices]
(with-open [rdr (clojure.java.io/reader file)]
(let [lines (line-seq rdr)]
(multi-nth lines indices))))
Bây giờ, (read-lines "my-file" [0])
công trình mà không có một vấn đề. Tuy nhiên, đi qua trong [0 1]
mang lại cho tôi stacktrace sau:
java.lang.RuntimeException: java.io.IOException: Stream closed
Util.java:165 clojure.lang.Util.runtimeException
LazySeq.java:51 clojure.lang.LazySeq.sval
LazySeq.java:60 clojure.lang.LazySeq.seq
Cons.java:39 clojure.lang.Cons.next
RT.java:769 clojure.lang.RT.nthFrom
RT.java:742 clojure.lang.RT.nth
core.clj:832 clojure.core/nth
AFn.java:163 clojure.lang.AFn.applyToHelper
AFn.java:151 clojure.lang.AFn.applyTo
core.clj:602 clojure.core/apply
core.clj:2341 clojure.core/partial[fn]
RestFn.java:408 clojure.lang.RestFn.invoke
core.clj:2430 clojure.core/map[fn]
Dường như dòng suối đang được đóng trước khi tôi có thể đọc dòng thứ hai từ tập tin. Thật thú vị, nếu tôi tự kéo ra một dòng từ tệp có nội dung như (nth lines 200)
, cuộc gọi multi-nth
hoạt động với tất cả các giá trị < = 200.
Bất kỳ ý tưởng gì đang xảy ra?
Tốt điểm. Tôi có cần sử dụng các cuộc gọi phương thức truy cập ngẫu nhiên Java cấp thấp hơn để có được đúng không? –
Tôi nghĩ rằng bạn có thể nhận được mã rõ ràng bằng cách sử dụng lập chỉ mục bản đồ và bộ lọc. Tôi sẽ cập nhật sau một phút ... –
Ah được rồi, thật tuyệt. Nếu đó là cú pháp xấu hơn bạn muốn, bạn có thể sử dụng giữ lập chỉ mục và có thể ngưng tụ chức năng lọc. Nhìn vào nó bây giờ ... –