Ho un file xml da 1,6 gb e quando lo analizzo con Sax Machine non sembra che stia trasmettendo o mangiando il file in blocchi - piuttosto sembra per caricare l'intero file in memoria (o forse c'è una perdita di memoria da qualche parte?) perché il mio processo di rubino sale di 2.5 grammi di ram. Non so dove smette di crescere perché ho esaurito la memoria.L'analisi di file di grandi dimensioni con SaxMachine sembra caricare l'intero file in memoria
Su un file più piccolo (50 MB) sembra che venga caricato l'intero file. Il mio compito esegue iterazioni sui record nel file xml e salva ogni record in un database. Ci vogliono circa 30 secondi di "idling" e poi all'improvviso le query del database iniziano ad essere eseguite.
Pensavo che SAX avrebbe dovuto consentire di lavorare con file di grandi dimensioni come questo senza caricare tutto in memoria.
C'è qualcosa che sto trascurando?
Molte grazie
aggiornamento per aggiungere codice di esempio
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
Come potete vedere, non mi interessa circa l'elemento <listings>
nel feed. Voglio solo gli attributi di ogni elemento <listing>
.
L'output è simile al seguente:
Parsing
... wait forever
Importing (actually, I don't ever see this on the big file (1.6gb) because too much memory is used :(
Semplice risposta alla tua domanda: sì, c'è qualcosa che si affaccia su. Sfortunatamente non ci hai detto di cosa si tratta. Nessuno può trovare perdite di memoria nel codice che non possono vedere. –
@ MichaelKay Ho aggiunto un esempio. Grazie – jakeonrails