Mam plik xml 1,6 gb, a kiedy parsuję go w Sax Machine, nie wydaje się, żeby był streaming lub jedzenie pliku w kawałkach - raczej pojawia się do załadowania całego pliku do pamięci (a może gdzieś tam jest wyciek pamięci?), ponieważ mój proces ruby wspina się w górę o 2,5 gb pamięci RAM. Nie wiem, gdzie przestaje rosnąć, bo zabrakło mi pamięci.Parsowanie dużego pliku przy użyciu SaxMachine'a wydaje się być wczytywaniem całego pliku do pamięci
Na mniejszym pliku (50mb) wygląda również na ładowanie całego pliku. Moje zadanie iteruje po rekordach w pliku xml i zapisuje każdy rekord w bazie danych. Trwa to około 30 sekund "bezczynności", a następnie nagle rozpoczyna się wykonywanie zapytań do bazy danych.
Pomyślałem, że SAX miał pozwolić ci pracować z dużymi plikami, takimi jak ta, bez ładowania wszystkiego w pamięci.
Czy jest coś, co przeoczyłem?
Dziękujemy
Aktualizacja dodać przykładowy kod
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
Jak widać, nie dbam o elemencie w paszy <listings>
. Chcę tylko atrybuty każdego elementu <listing>
.
Wyjście wygląda następująco:
Parsing
... wait forever
Importing (actually, I don't ever see this on the big file (1.6gb) because too much memory is used :(
Prosta odpowiedź na pytanie: tak, coś jest nie jesteś z widokiem. Niestety nie powiedziałeś nam, co to jest. Nikt nie może znaleźć wycieków pamięci w kodzie, którego nie widzą. –
@MichaelKay Dodałem próbkę. Dzięki – jakeonrails