Я новичок в Clojure, и мой первый проект должен иметь дело с огромным (250 + GB) XML файлом. Я хочу поместить его в PostgreSQL для последующего его обработки, но не знаю, как подойти к такому большому файлу.
Огромный XML в Clojure
Ответ 1
Я использовал новый clojure.data.xml
для обработки дампа в Википедии на 31 ГБ на скромном ноутбуке. Старая библиотека lazy-xml
contrib не работала для меня (закончилась нехватка памяти).
https://github.com/clojure/data.xml
Упрощенный пример кода:
(require '[clojure.data.xml :as data.xml]) ;'
(defn process-page [page]
;; ...
)
(defn page-seq [rdr]
(->> (:content (data.xml/parse rdr))
(filter #(= :page (:tag %)))
(map process-page)))
Ответ 2
Обработка огромного xml обычно выполняется с помощью SAX, в случае Clojure это http://richhickey.github.com/clojure-contrib/lazy-xml-api.html
см (parse-seq File/InputStream/URI)
Ответ 3
Если xml представляет собой набор записей, https://github.com/marktriggs/xml-picker-seq - это то, что вам нужно для обработки записей в xml независимо от размера xml. Он использует XOM под капотом и обрабатывает одну "запись" за раз.
Ответ 4
Вы также можете использовать синтаксический анализатор expresso для массивных файлов (www.expressoxml.com). Он может анализировать файлы объемом 36 ГБ и более, поскольку он не ограничен размером файла. Он может вернуть до 230 000 элементов из поиска, и он доступен через потоковое вещание через "облако" со своего веб-сайта. И лучше всего их версия для разработчиков бесплатна.