Tengo un archivo xml de 1.6 gb, y cuando lo analizo con Sax Machine no parece estar transmitiendo o comiendo el archivo en fragmentos, sino que aparece para cargar todo el archivo en la memoria (¿o quizás hay una pérdida de memoria en alguna parte?) porque mi proceso de rubí sube más de 2,5 gb de ram. No sé dónde deja de crecer porque me quedé sin memoria.Analizando un archivo grande con SaxMachine parece que está cargando todo el archivo en la memoria
En un archivo más pequeño (50mb) también parece estar cargando todo el archivo. Mi tarea itera sobre los registros en el archivo xml y guarda cada registro en una base de datos. Tarda unos 30 segundos en "inactividad" y, de repente, las consultas de la base de datos comienzan a ejecutarse.
Pensé que SAX se suponía que le permitiera trabajar con archivos de gran tamaño como este sin cargar todo en la memoria.
¿Hay algo que estoy pasando por alto?
Muchas gracias
actualización para añadir código de ejemplo
class FeedImporter
class FeedListing
include ::SAXMachine
element :id
element :title
element :description
element :url
def to_hash
{}.tap do |hash|
self.class.column_names.each do |key|
hash[key] = send(key)
end
end
end
end
class Feed
include ::SAXMachine
elements :listing, :as => :listings, :class => FeedListing
end
def perform
open('~/feeds/large_feed.xml') do |file|
# I think that SAXMachine is trying to load All of the listing elements into this one ruby object.
puts 'Parsing'
feed = Feed.parse(file)
# We are now iterating over each of the listing elements, but they have been "parsed" from the feed already.
puts 'Importing'
feed.listings.each do |listing|
Listing.import(listing.to_hash)
end
end
end
end
Como se puede ver, no me importa el elemento <listings>
en la alimentación. Solo quiero los atributos de cada elemento <listing>
.
La salida tiene el siguiente aspecto:
Parsing
... wait forever
Importing (actually, I don't ever see this on the big file (1.6gb) because too much memory is used :(
Simple respuesta a tu pregunta: sí, hay algo que están pasando por alto. Desafortunadamente no nos has dicho de qué se trata. Nadie puede encontrar pérdidas de memoria en el código que no puede ver. –
@MichaelKay He agregado una muestra. Gracias – jakeonrails