2013-02-25 18 views
5

के कारण सीरियल json_decode मेरे पास एक बड़ी जेसन फ़ाइल (7.3 एमबी) है जो मैं json_decode करने की कोशिश करता हूं और यह स्मृति सीमा के कारण विफल रहता है (घातक त्रुटि: 134217728 बाइट्स की अनुमति दी गई स्मृति आकार)। क्या एक समय में एक ऑब्जेक्ट/नोड के साथ, जेसन फ़ाइल को क्रमशः डीकोड करने का कोई तरीका है?स्मृति सीमा

+0

क्या आपने इस 'ini_set (' memory_limit ',' 256M ') जैसे कुछ के बारे में सोचा है; '? – HamZa

+0

एक कस्टम पार्सर हाँ के साथ, json_decode पूरी स्ट्रिंग को पढ़ने जा रहा है। यद्यपि यदि आप पूरी परिणामी ऑब्जेक्ट को स्मृति में रखने के लिए जा रहे हैं, तो हो सकता है कि आप पर्याप्त स्मृति को सहेज न सकें। – datasage

+0

संरचना पर निर्भर करता है। यदि यह वस्तुओं की एक सरणी थी, तो स्तर 1 में डिकोडिंग फिर से शुरू करना किसी भी पार्सर के साथ तुच्छ होगा। PEARs Services_Json या upgradeadephp/json_decode निश्चित रूप से ऐसे के लिए हैक किया जा सकता है। पूर्ववर्ती पार्सिंग नेस्टेड संरचनाएं अधिक बोझिल होती हैं, जो रिकर्सिव तरीके से होती हैं जिसमें जेएसओएन पार्सर्स आमतौर पर लागू होते हैं। – mario

उत्तर

0

मुझे लगता है कि सिद्धांत में आप स्ट्रिंग की शुरुआत और समाप्ति से पात्रों को पार्स करने के लिए कुछ तर्क लिख सकते हैं, ऑब्जेक्ट/सरणी प्रस्तुति के निर्माण के दौरान स्मृति में स्ट्रिंग आकार को कम कर सकते हैं, लेकिन यह एक गंभीर दर्द होगा।

क्यों न केवल अपनी मेमोरी सीमाएं बढ़ाएं, या यदि यह कुछ JSON है जिसे अक्सर डीकोड किया जाना आवश्यक है (यानी प्रत्येक अनुरोध के साथ वेब एप्लिकेशन में) तो आपको इसे अधिक उपयोग घटकों में अलग करने पर विचार करना चाहिए।

+2

यह एक सैद्धांतिक प्रश्न भी है, मुझे पता है कि मैं स्मृति बढ़ा सकता हूं, लेकिन अगर जेसन आकार 3 जीबी है तो क्या होगा। मैं पूछ रहा हूं कि कोई पुस्तकालय है जो सभी {} प्रतीकों को गिनती है और मुझे उदाहरण 1, ऑब्जेक्ट 99 99 99 पर उदाहरण के लिए शुरू करने की इजाजत देता है, इससे कोई फर्क नहीं पड़ता कि यह फ़ाइल में कहां है और कितनी हाइरहर्सी पहले थी) और वहां से ऑब्जेक्ट और/या subobject से शुरू होने वाला डीकोड –

+0

क्या आपने 'json_decode' फ़ंक्शन के दूसरे पैरामीटर ('bool $ assoc = false') को सक्षम करने का प्रयास किया था? यह जेसन को ऑब्जेक्ट के बजाए एक साधारण सरणी में स्टोर करेगा, जो कुछ मेमोरी को बचा सकता है .. – MatRt

+0

यदि यह पर्याप्त नहीं है, तो मुझे लगता है कि आपको अपना खुद का सरल पार्सर लिखना होगा (आपकी आवश्यकता को कवर करना, आवश्यक अतिरिक्त जटिल JSON नहीं) क्योंकि ऐसा लगता है कि सैक्स JSON पार्सर का कोई PHP कार्यान्वयन नहीं है – MatRt

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

  • कोई संबंधित समस्या नहीं^_^