मेरे पास 1.6 जीबी एक्सएमएल फ़ाइल है, और जब मैं सैक्स मशीन के साथ इसे पार्स करता हूं तो ऐसा लगता है कि यह स्ट्रीमिंग या फाइलों में फाइल नहीं खा रहा है - बल्कि यह प्रतीत होता है पूरी फ़ाइल को स्मृति में लोड करने के लिए (या हो सकता है कि कहीं मेमोरी लीक हो?) क्योंकि मेरी रूबी प्रक्रिया 2.5 जीबी रैम के ऊपर चढ़ती है। मुझे नहीं पता कि यह कहां बढ़ रहा है क्योंकि मैं स्मृति से बाहर भाग गया।सैक्समाचिन के साथ बड़ी फ़ाइल को पार्स करना पूरी फ़ाइल को स्मृति में लोड कर रहा है
एक छोटी फ़ाइल (50 एमबी) पर यह पूरी फ़ाइल लोड हो रहा है। मेरा कार्य xml फ़ाइल में रिकॉर्ड्स पर पुनरावृत्त करता है और प्रत्येक रिकॉर्ड को डेटाबेस में सहेजता है। इसमें "idling" के लगभग 30 सेकंड लगते हैं और फिर अचानक डेटाबेस क्वेरी निष्पादन शुरू हो जाती है।
मैंने सोचा था कि SAX आपको पूरी तरह से स्मृति में लोड किए बिना बड़ी फ़ाइलों के साथ काम करने की अनुमति दे रहा था।
क्या मुझे कुछ दिख रहा है?
बहुत धन्यवाद
अद्यतन कोड नमूना
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
जोड़ने के लिए आप देख सकते हैं, मैं फ़ीड में <listings>
तत्व के बारे में परवाह नहीं है। मैं सिर्फ प्रत्येक <listing>
तत्व के गुण चाहता हूं।
उत्पादन इस तरह दिखता है:
Parsing
... wait forever
Importing (actually, I don't ever see this on the big file (1.6gb) because too much memory is used :(
सरल जवाब आपके सवाल का: हाँ, वहाँ कुछ आप को अनदेखा कर रहे है। दुर्भाग्य से आपने हमें यह नहीं बताया है कि यह क्या है। कोई भी कोड में मेमोरी लीक नहीं ढूंढ सकता है जिसे वे नहीं देख सकते हैं। –
@ माइकलके मैंने एक नमूना जोड़ा है। धन्यवाद – jakeonrails