2012-06-20 12 views
12

मैं निम्न में से दोनों का उपयोग, लेकिन 12 एमबीयूआरएल से 12 एमबी टेक्स्ट डेटा डाउनलोड और एसडी कार्ड में सहेजें ... हीप मेमोरी प्रोब होती है। कोई भी समाधान?

char[] chars = new char[1024]; 
int len; 
while((len=buffer.read(chars))>0) { 
    data.append(chars,0,len); 
} 

और

while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
} 
+0

मैं एक्सएमएल पार्स कर रहा हूं .. इसलिए पूरे एक्सएमएल को सिंगल स्ट्रिंग में चाहिए .. अगर मैं एसडी कार्ड में संग्रहीत हूं तो मुझे इसे स्ट्रिंग में भी पढ़ना होगा जिसमें अधिक ढेर मेमोरी की भी आवश्यकता है ... परिणाम क्रैश है .. –

उत्तर

-1

मुझे एक ही समस्या थी और मैं इसका उपयोग करता हूं, यदि संभव हो तो आपको XML फ़ाइल को विभाजित करना चाहिए और फिर उस फ़ाइल को स्ट्रिंग में पढ़ने और इसे पार्स करने का प्रयास करें।

+0

धन्यवाद यह मेरे लिए भी अच्छा विचार देख रहा है। :) –

+0

क्या आप समझा सकते हैं कि आप एक्सएमएल के हिस्से का विश्लेषण करने का इरादा रखते हैं? मुझे जो पता है उससे अमान्य होगा। –

1

आप शायद स्मृति में पूरे 12mb आवंटित की कोशिश करनी चाहिए और फिर अगर जाँच data..of विशाल के लिए काम नहीं कर रहा आवंटन सफल होता है। फिर बफर को डेटा लोड करें।

या, यदि आप भागों में फ़ाइल लोड करने में सक्षम हैं और उन्हें संसाधित करते हैं तो यह इस तरह से प्रभावी होना चाहिए।

2

क्यों अपने एक्सएमएल को टुकड़ों में नहीं पढ़ा और एसडी कार्ड में प्रत्येक खंड को सहेजना नहीं है? इस समाधान में एकमात्र समस्या यह है कि आपको किसी प्रकार का एक्सएमएल स्ट्रीम पार्सर चाहिए जिसका उपयोग आप गतिशील रूप से अपने एक्सएमएल के हिस्सों को लोड कर सकते हैं और उन्हें पार्स कर सकते हैं।

हो सकता है कि आप एक्सएक्स के लिए स्ट्रीमिंग एपीआई का उपयोग कर सकें, जिसे स्टाक्स कहा जाता है, और इस मामले के लिए कस्टम इनपुट स्ट्रीम लिखें। कुछ उदाहरण http://www.vogella.com/articles/JavaXML/article.html#javastax

8

एसडी कार्ड में डेटा में डेटा सहेजें। फिर, Android के अंतर्निहित XmlPullParser, तो आप पहले से सहेजी गई फ़ाइल को पार्स कर सकते हैं निम्नलिखित तरीके का उपयोग कर:

  1. ओपन फाइल तुम सिर्फ डाउनलोड की विधि setInput(InputStream inputStream, String inputEncoding)
  2. मज़ा
  3. उपयोग पर एक इनपुट स्ट्रीम पार्स करने के दौरान यह विशाल एक्सएमएल फ़ाइल।
2
  1. XmlPullParser उदाहरण
  2. कॉल अपने इनपुट (या तो रीडर या InputStream) के साथ XmlPullParser.setInput बनाएं; यह वह डेटा है जिसे आप डाउनलोड करते हैं (सॉकेट या अन्य तरीकों से)
  3. अपनी XML टेक्स्ट फ़ाइल को पार्स करने के लिए XmlPullParser के फ़ंक्शंस का उपयोग करें।

नोट: आपको इसे गैर-मुख्य धागे पर करने की आवश्यकता है, फ़ाइल को डाउनलोड करने में लंबा समय लग सकता है। (वैसे भी आप यूआई थ्रेड पर नेटवर्क कार्य नहीं कर सकते हैं)। यह मेमोरी-कुशल होना चाहिए, XmlPullParser स्मृति में डेटा कैश नहीं करता है। फ़ाइल को पहले एसडी कार्ड में स्टोर करने की आवश्यकता नहीं है।

त्रुटियों के लिए भी देखें: कनेक्शन समय-बहिष्कार, एक्सएमएल में त्रुटियां इत्यादि। पार्सर रिपोर्ट करता है कि यह दस्तावेज़ के अंत तक पहुंचने पर आपकी नौकरी को सफलता के रूप में देखें। कुछ हिस्सों में

1

पार्स करने के लिए 1 एमबी डेटा & उपयोग SAXParser आप पूरे एक्सएमएल धारा पार्स और एक विशाल डोम वस्तु बनाने के लिए की जरूरत है, या मात्रा कर पार्स करने जाएंगे?

यदि आपको केवल एक चीज की तुलना में पूर्ण एक्सएमएल का विश्लेषण करना है जो आप कर सकते हैं तो अधिक मेमोरी और 64 बिट ओएस प्राप्त करना है।
यदि नहीं, तो स्ट्रीम से सीधे या इसे स्थानीय रूप से सहेजने के बाद भाग को प्राप्त करने और पार्स करने के लिए SAX या StAX पार्सर का उपयोग करें।

1

के रूप में उपयोगकर्ता के चाहिए ने कहा, मैं एक ही बार में हिस्सा द्वारा डाउनलोड करने हिस्सा नहीं है और पूरी फ़ाइल की सिफारिश करेंगे, कारण यदि आपका मुख्य चलने यह मंदी अपने सभी आवेदन कर सकते हैं पर कर रहे हैं, तो asynctask के साथ करते हैं और इसे खंड द्वारा खंडित करें। इसके अलावा मैं आपको विषय के बारे में कुछ पोस्ट की सिफारिश कर सकता हूं।

अलावे this पद के बारे में आप how to use SAX

अलावे this कोई दूसरा SAX and DOM tutorial

पा सकते हैं एक लेख के लिए एक लिंक मिल सकता है मुझे आशा है कि यह दो लेख मदद कर सकते हैं आप जो चाहते हैं उसे प्राप्त करते हैं। या यदि दोनों लेख आपकी समस्या से असफल होते हैं, तो आप अपने एक्सएमएल की व्यवस्था करने के लिए एक बेहतर तरीका खोजने का प्रयास कर सकते हैं, ऐसा करने का हमेशा एक बेहतर तरीका है, आपको बस थोड़ा कठिन विचार करने की आवश्यकता है।

अद्यतन:

-यह अन्य पोस्ट के बारे में STAX सहायक हो सकता है, कारण XML प्रोसेसिंग के लिए एक स्ट्रीमिंग एपीआई है, तो यह आपके मामले के लिए सबसे अच्छा हो सकता है।

+0

क्यों नहीं अपने प्रश्न को फिर से खोलने की कोशिश करने के बजाय, आप बेहतर तरीके से एक और समान प्रश्नों की खोज करना शुरू कर देते हैं, या फिर अपना प्रश्न दोबारा कर सकते हैं ताकि यह अधिक सुगम हो, क्योंकि यह खुला हो जाने पर भी, मुझे इसके लिए एक उज्जवल भविष्य नहीं दिख रहा है। लेकिन शायद यह आपकी मदद कर सकता है [कार्टूनिंग के बारे में पोस्ट करें] (http://stackoverflow.com/questions/1357403/how-to-cartoon-ify-an-image-programmatically) –

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