Publiqué antes en un huge XML file - es un XML de 287 GB con volcado de Wikipedia que no quiero poner en el archivo CSV (autores de revisiones y marcas de tiempo). Logré hacer eso hasta cierto punto. Antes de obtener el error StackOverflow, pero ahora, después de resolver el primer problema, obtengo: java.lang.OutOfMemoryError: error de espacio en el montón de Java.Archivo enorme en Clojure y error de espacio en montón Java
Mi código (en parte tomado de Justin Kramer respuesta) se ve así:
(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))))
no me presento article-title
, revision-user
y revision-title
funciones, ya que simplemente toman datos de un lugar específico en la página o hash de revisión. Cualquiera me puede ayudar con esto: soy realmente nuevo en Clojure y no entiendo el problema.
El punto sobre dorun podría aclararse un poco para alguien nuevo en Clojure: la función de archivo abierto como se muestra en la pregunta devuelve la secuencia de resultados de las llamadas a las páginas de proceso, y cuando se llama a la función desde el repl, imprimiendo la secuencia hace que todos los resultados se mantengan en la memoria al mismo tiempo. Llamar a dorun sobre el resultado hace que los elementos de la secuencia se evalúen y no se devuelvan, de modo que nunca es necesario tener todos los resultados en memoria al mismo tiempo. –
¡Gracias por la explicación! Entiendo (con suerte) ahora cómo funciona la pereza en este fragmento de código y cambié lo que usted propuso, pero aún 'OutOfMemoryError: Java montón de espacio '. Estoy trabajando en una muestra de 1 GB del archivo final, pero aún se inicia el error de memoria. Estaría muy agradecido por cualquier ayuda. – trzewiczek
Ver mi última actualización. Si aún obtiene el error OutOfMemory, no estoy seguro de por qué. Utilicé un código muy similar a este sin problemas de memoria. –