Opublikowałem wcześniej na huge XML file - jest to 287GB XML ze zrzutem Wikipedy Chcę ot umieścić w pliku CSV (autorzy wersji i znaczniki czasu). Udało mi się to zrobić do pewnego momentu. Zanim otrzymałem błąd StackOverflow, ale teraz po rozwiązaniu pierwszego problemu otrzymuję: java.lang.OutOfMemoryError: Błąd przestrzeni sterty Java.Ogromny plik w Clojure i Java space space error
Mój kod (częściowo zaczerpnięte z Justinem Kramer odpowiedzi) wygląda tak:
(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))))
ja nie wykazują article-title
, revision-user
i revision-title
funkcji, ponieważ po prostu wziąć dane z określonego miejsca na stronie lub hash rewizji. Każdy może mi w tym pomóc - jestem naprawdę nowy w Clojure i nie mam problemu.
Punkt o dorun może być nieco jaśniejszy dla kogoś nowego w Clojure: funkcja otwartego pliku, jak pokazano w pytaniu, zwraca sekwencję wyników wywołań do stron procesu, a gdy funkcja jest wywoływana z repliki, drukowanie sekwencja powoduje, że wszystkie wyniki są przechowywane w pamięci w tym samym czasie. Wywołanie doruna na wyniku powoduje, że elementy sekwencji są oceniane, a zero zwracane, dzięki czemu nigdy nie ma potrzeby, aby wszystkie wyniki były w pamięci w tym samym czasie. –
Dziękuję za wyjaśnienie! Rozumiem (mam nadzieję) teraz, jak lenistwo działa w tym fragmencie kodu i zmieniło to, co zaproponowałeś, ale nadal "OutOfMemoryError: Java heap space". Pracuję nad próbką ostatecznego pliku o wielkości 1 GB, ale nadal wykrywa błąd pamięci. Byłbym bardzo wdzięczny za każdą pomoc. – trzewiczek
Zobacz moją najnowszą aktualizację. Jeśli nadal pojawia się błąd OutOfMemory, nie jestem pewien dlaczego. Użyłem kodu bardzo podobnego do tego bez problemów z pamięcią. –