Просто чтобы прояснить, (:content (data.xml/parse rdr :coalescing false))
ЛЕНИТ.Проверьте его класс или потяните первый предмет (он сразу же вернется), если вы не уверены.вложенная лень.Я думаю, ваш код страдает от последнего.
Вот что я рекомендую:
1) Добавьте (dorun)
в конец цепочки вызовов ->>
.Это заставит последовательность быть полностью реализованной, не держась за голову.
2) Измените for
в process-page
на doseq
.Вы плюете на файл, что является побочным эффектом, и вы не хотите делать это лениво.
Как рекомендует Артур, возможно, вы захотите открыть выходной файл один раз и продолжать писать в неговместо того, чтобы открывать и писать (плевать) для каждой записи в Википедии.
ОБНОВЛЕНИЕ :
Вот переписывание, которое пытается разделить проблемы более четко:
(defn filter-tag [tag xml]
(filter #(= tag (:tag %)) xml))
;; lazy
(defn revision-seq [xml]
(for [page (filter-tag :page (:content xml))
:let [title (article-title page)]
revision (filter-tag :revision (:content page))
:let [user (revision-user revision)
time (revision-timestamp revision)]]
[time user title]))
;; eager
(defn transform [in out]
(with-open [r (io/input-stream in)
w (io/writer out)]
(binding [*out* out]
(let [xml (data.xml/parse r :coalescing false)]
(doseq [[time user title] (revision-seq xml)]
(println (str "\"" time "\";\"" user "\";\"" title "\"\n")))))))
(transform "dump.xml" "data.csv")
Я не вижу здесь ничего, что могло бы вызвать чрезмерное использование памяти.