2012-12-21 6 views
8

मैं हर 12 घंटे में अपने अमेज़ॅन ईसी 2 माइक्रो इंस्टेंस पर क्रॉन नौकरी चला रहा हूं। यह 118 एमबी फ़ाइल डाउनलोड करता है और जेसन लाइब्रेरी का उपयोग करके इसे पार करता है। यह निश्चित रूप से स्मृति को स्मृति से बाहर चलाता है। मेरे उदाहरण में 416 एमबी मेमोरी मुफ्त है लेकिन फिर मैं स्क्रिप्ट चलाता हूं जो इसे 6 एमबी तक गिर जाता है और फिर इसे ओएस द्वारा मारा जाता है।JSON पेलोड के 100 एमबी पार्स करने के लिए कुशल तरीका

मुझे आश्चर्य है कि मेरे विकल्प यहां क्या हैं? क्या रूबी के माध्यम से इसे कुशलता से पार्स करना संभव है या क्या मुझे सी जैसे निम्न स्तर की सामग्री में गिरावट है? मैं एक और अधिक सक्षम अमेज़ॅन उदाहरण प्राप्त कर सकता हूं लेकिन मैं वास्तव में जानना चाहता हूं कि रुबी के माध्यम से ऐसा करना संभव है या नहीं।

अद्यतन: मैंने यजल को देखा है। यह आपको जेसन ऑब्जेक्ट्स को पार्स के रूप में दे सकता है, लेकिन समस्या यह है कि, यदि आपकी JSON फ़ाइल में केवल 1 रूट ऑब्जेक्ट है, तो उसे सभी फ़ाइल को पार्स करने के लिए मजबूर किया जाएगा। मेरे JSON इस तरह दिखता है:

--Root 
    -Obj 1 
    -Obj 2 
    -Obj 3 

तो अगर मैं करता हूँ:

parser.parse(file) do |hash| 
    #do something here 
end 

जब से मैं केवल 1 जड़ वस्तु है, यह पूरे JSON पार्स होगा। यदि Obj 1/2/3 रूट था, तो यह काम करेगा क्योंकि यह मुझे एक-एक करके देगा, लेकिन मेरा JSON ऐसा नहीं है और यह 500 एमबी मेमोरी को पार्स करता है और खाता है ...

अद्यतन # 2: यहाँ एक छोटे (7MB) बड़े 118mb फ़ाइल का संस्करण है:

चला

यह, मैं सिर्फ कुछ बाइट्स फ़ाइल से बंद नहीं लिया parseable है, बस इतना है कि आप एक यह रूप में देखते हैं पूरा। सरणी मैं देख रहा हूँ इस

events = json['resultsPage']['results']['event'] 

धन्यवाद

+4

के रूप में json पार्स कर सकते हैं यह 6 या अधिक खंडों में डाउनलोड को विभाजित करने और फिर उन्हें वापस रख एक साथ संभव है? –

+2

JSON टेक्स्ट का 100 एमबी? आप क्या स्टोर कर रहे हैं? अलेक्जेंड्रिया की पुस्तकालय? ': पी' –

+3

आप इसके लिए JSON का उपयोग क्यों कर रहे हैं? नौकरी के लिए सही प्रारूप की तरह नहीं लगता है। कुछ और अधिक रिकॉर्ड उन्मुख (यहां तक ​​कि सीएसवी) एक बेहतर मैच होगा। यदि आप प्रारूप को नियंत्रित नहीं कर सकते हैं तो हो सकता है कि आप रिकॉर्ड ऑब्जेक्ट JSON में प्रारूप को मजबूर करने के लिए रूट ऑब्जेक्ट को मैन्युअल रूप से बंद कर दें। –

उत्तर

6

YAJL एक स्ट्रीमिंग पार्सर लागू करता है। आप इसे अपने JSON ऑन-द-फ्लाई को पढ़ने के लिए उपयोग कर सकते हैं, ताकि आप सामग्री के साथ आने पर काम कर सकें, फिर उनके साथ किए जाने के बाद उन्हें छोड़ दें (और उनसे जेनरेट की गई डेटा संरचनाएं)। यदि आप इसके बारे में चतुर हैं, तो यह आपको आपकी स्मृति सीमाओं के तहत रखेगा।

संपादित करें: अपने डेटा के साथ, आप पूरी वस्तु को पार्स करने के बजाय, एक समय में JSON ऑब्जेक्ट के हिस्सों को खींचने में वास्तव में रुचि रखते हैं। यह काफी कठिन है, और वास्तव में यह आवश्यक है कि आप अपना खुद का पार्सर लागू करें। नट और इसके बारे में बोल्ट है कि आप करना चाहते हैं:

  1. घटनाओं सरणी
  2. सरणी में प्रत्येक घटना के लिए में कदम है, घटना
  3. पार्स कुछ कॉलबैक फ़ंक्शन में पार्स घटना दर्रा
  4. अगली घटना के लिए पार्स किए गए ईवेंट और स्रोत इनपुट को मुफ्त मेमोरी में छोड़ दें।

यह यजल के साथ काम नहीं करेगा, क्योंकि आप कई ऑब्जेक्ट्स के बजाय यहां एक ऑब्जेक्ट से निपट रहे हैं। इसे यजल के साथ काम करने के लिए, आपको ईवेंट ऑब्जेक्ट सीमाओं को खोजने के लिए JSON मैन्युअल रूप से पार्स करने की आवश्यकता होगी, फिर प्रत्येक इवेंट ऑब्जेक्ट को जेएसओएन पार्सर को deserialization के लिए पास करें। रैगेल की तरह कुछ आपके लिए इस प्रक्रिया को सरल बना सकता है।

बेशक, अपने एडब्ल्यूएस इंस्टेंस को अपग्रेड करना आसान होगा।

+0

कृपया मेरे अपडेट को Yajl के साथ होने वाली परेशानी को समझाएं ... – 0xSina

+1

आप जेएसओएन को रूट ऑब्जेक्ट को स्ट्रिप करने के लिए sed या कुछ के साथ प्री-पार्स कर सकते हैं, और इसे ब्रैकेट के साथ प्रतिस्थापित कर सकते हैं, जिससे आप ऑब्जेक्ट्स को चलाने के लिए ऑब्जेक्ट्स ले सकते हैं , एक वस्तु के बजाय जिसमें एक सरणी का गुच्छा होता है। –

+0

यदि आप ऑब्जेक्ट के पहले ~ 500 बाइट्स प्रदान कर सकते हैं, तो हम अधिक विशेष रूप से सहायता करने में सक्षम हो सकते हैं। –

0

कुछ yaji की तरह एक धारा

+0

कृपया मेरे अपडेट की जांच करें जो मुझे यजल के साथ है ... – 0xSina

संबंधित मुद्दे