Tôi đã đăng trước đây trên huge XML file - đó là một XML 287GB với Wikipedia dump Tôi muốn ot đưa vào tệp CSV (sửa đổi tác giả và dấu thời gian). Tôi đã làm được điều đó cho đến một thời điểm nào đó. Trước khi tôi nhận được lỗi StackOverflow, nhưng bây giờ sau khi giải quyết vấn đề đầu tiên tôi nhận được: java.lang.OutOfMemoryError: lỗi vùng nhớ Java.Tệp lớn trong Clojure và lỗi không gian heap Java
Mã của tôi (một phần lấy từ Justin Kramer câu trả lời) trông như thế:
(defn process-pages
[page]
(let [title (article-title page)
revisions (filter #(= :revision (:tag %)) (:content page))]
(for [revision revisions]
(let [user (revision-user revision)
time (revision-timestamp revision)]
(spit "files/data.csv"
(str "\"" time "\";\"" user "\";\"" title "\"\n")
:append true)))))
(defn open-file
[file-name]
(let [rdr (BufferedReader. (FileReader. file-name))]
(->> (:content (data.xml/parse rdr :coalescing false))
(filter #(= :page (:tag %)))
(map process-pages))))
Tôi không hiển thị article-title
, revision-user
và revision-title
chức năng, bởi vì họ chỉ đơn giản là lấy dữ liệu từ một nơi cụ thể trong trang hoặc băm sửa đổi. Bất cứ ai cũng có thể giúp tôi với điều này - Tôi thực sự mới trong Clojure và không nhận được vấn đề.
Điểm về dorun có thể được làm rõ hơn một chút đối với người mới dùng Clojure: chức năng mở tệp như được hiển thị trong câu hỏi trả về chuỗi kết quả cuộc gọi tới trang xử lý và khi chức năng được gọi từ repl, in trình tự làm cho tất cả các kết quả được giữ trong bộ nhớ cùng một lúc. Gọi dorun trên kết quả làm cho các phần tử của chuỗi được đánh giá và không được trả về, do đó không bao giờ cần phải có tất cả các kết quả trong bộ nhớ cùng một lúc. –
Thanx để giải thích! Tôi hiểu (hy vọng) bây giờ làm thế nào sự lười biếng hoạt động trong đoạn mã này và thay đổi những gì bạn đề xuất, nhưng vẫn 'OutOfMemoryError: không gian heap Java'. Tôi đang làm việc trên một mẫu 1GB của tập tin cuối cùng, nhưng nó vẫn đá lỗi bộ nhớ. Sẽ thực sự biết ơn vì sự giúp đỡ nào. – trzewiczek
Xem cập nhật mới nhất của tôi. Nếu bạn vẫn gặp lỗi OutOfMemory, tôi không chắc tại sao. Tôi đã sử dụng mã rất giống với điều này mà không có vấn đề về bộ nhớ. –