6

मेरे एंड्रॉइड एप्लिकेशन में आवश्यकताएं सर्वर से छवियों को लाने और उन्हें ढेर स्मृति में कैश करने की आवश्यकता है।बेस 64String में एक एकल वर्ण कितने बाइट रखता है? 1, 2 या अधिक

अनुरोध प्राप्त करने पर, सर्वर पहले byte[] को Base64String में एन्कोड करता है और उस स्ट्रिंग को देता है। और, ImageView में इसे प्रस्तुत करने के समय एंड्रॉइड एप्लिकेशन Base64String को byte[] पर डीकोड करता है, Bitmap बनाता है, और इसे ImageView पर रखता है।

चूंकि सब कुछ कैश में है, तो कुछ बिंदु पर स्मृति से बाहर निकलने के लिए आवेदन की संभावना है, और गंभीर रूप से दुर्घटनाग्रस्त हो जाता है।

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

Bitmap को उपयोगकर्ता छवि से दूर जाने के बाद पुनर्नवीनीकरण किया गया है, इसलिए Bitmap प्रभावी रूप से तब तक कोई स्मृति नहीं रख रहा है जब तक हम दूर हैं।

एक विशेष परीक्षण में, मैं 55 छवियां डाउनलोड करता हूं, और मेरा ढेर 16 MB से 42 MB तक बढ़ता है। इसका मतलब है, 55 छवियां 26 MB पर कब्जा करती हैं। जब मैं उन सभी को साफ़ करता हूं, तो ढेर 16 MB पर वापस आ जाता है।

लेकिन, जब मैं Base64String की संचयी राशि लेता हूं तो यह 11983840 पर आता है। और अगर मैं एक चरित्र पर विचार 1 byte रूप 11983840 bytes11.4 MB

समस्या है बनाता है, Base64String की लंबाई के संचयी योग केवल उपाय मेरे पास उपलब्ध, उपयोगकर्ता कितना स्मृति अपने चयन के द्वारा जारी किया जा सकता जाने के लिए मदद करता है ।

मैंने निम्नलिखित प्रश्न भी पढ़े हैं, जो कि Base64String के प्रत्येक 3 Bytes के लिए 4 Characters होगा।

Base64 length calculation?

सवाल यह है कि, Base64String में एक भी चरित्र कितने बाइट्स रखती है? 1, 2 या अधिक

तो 1 character1 byte, है और अपने परीक्षण में ढेर बढ़ता है और 26 एमबी से सिकुड़ता है। फिर Base64String की लंबाई का संचयी योग केवल 11.4 MB है?

enter image description here

इसका मतलब यह है चरित्र प्रति 1 Byte अपडेट किया गया।

enter image description here

यहाँ डिफ़ॉल्ट CharacterSet UTF-8

+0

इस लिंक का उल्लेख http://stackoverflow.com/questions/13378815/बेस 64-लंबाई-गणना? Lq = 1 –

+0

मैंने पहले से ही लिंक का उल्लेख किया है और इसलिए इसे मेरे प्रश्न के हिस्से के रूप में भी रखा है। लिंक में समस्या और यह काफी अलग हैं। –

उत्तर

2

चलें शुरू से ही शुरू होता है ...

Base64 एन्कोडिंग 64 अक्षर का एक सेट पर आधारित प्रारूप है - हर किरदार के लायक है डेटा के 6 बिट्स (2^6 = 64)। तो कनवर्ट करते समय, इनपुट की प्रत्येक 8-बिट बाइट (8/6) = 1.333333 ... अक्षर।

लेकिन चूंकि कंप्यूटर केवल पूरे बाइट स्टोर करते हैं, इसलिए यह कहना आसान है कि प्रत्येक 3 बाइट्स (3 * 8 = 24 बिट्स) इनपुट के लिए, 4 बेस -64 वर्ण उत्पन्न होते हैं (4 * 6 = 24 बिट्स)।

अब, आप कहते हैं कि आपकी बेस -64 स्ट्रिंग कुल लंबाई 11 मिलियन वर्ण है। जावा में, तार 16-बिट यूनिकोड प्रारूप में संग्रहीत होते हैं: 1 वर्ण = 2 बाइट्स।

तो 11 मिलियन वर्ण केवल कच्चे चरित्र डेटा में 20 एमबी से अधिक का उपयोग करेंगे। वह, वस्तुओं को संग्रहीत करने के लिए आवश्यक वस्तुओं, चर और अन्य राज्यों के साथ संयुक्त का मतलब है कि 26 एमबी आपके द्वारा उपयोग किए जा रहे डेटा की मात्रा के लिए एक उचित मूल्य है।

तो एक सामान्य नियम के आप स्मृति के उपयोग का अनुमान लगाने के लिए उपयोग करना चाहते हो सकता है (((input_data_in_bytes * 4/3) * 2) + कुछ एमबी)

+0

उत्तर के लिए धन्यवाद। यह वास्तव में एक अच्छा स्पष्टीकरण है। लेकिन, सवाल अभी भी खुला रहता है, क्योंकि मेरी नवीनतम खोज में मैंने डिफ़ॉल्ट चरित्र को यूटीएफ -8 के रूप में देखा। प्रश्न में "अद्यतन" अनुभाग की जांच करें। –

+1

@ वायोफॉप मुझे लगता है कि आप उलझन में हैं। 'DefaultCharset() 'मान आपके जावा प्रोग्राम * आपके ऑपरेटिंग सिस्टम के साथ इंटरैक्ट करते समय वर्णित वर्णसेट का प्रतिनिधित्व करता है * - स्ट्रीम और अन्य I/O से पढ़ने और लिखते समय यह एन्कोडिंग डेटा के साथ करना है। जावा स्ट्रिंग प्रकार के भीतर वर्णों को कैसे संग्रहीत किया जाता है, इसके साथ इसका कोई लेना-देना नहीं है, जो हमेशा 16 बिट यूनिकोड होता है। जैसा कि http://docs.oracle.com/javase/7/docs/api/java/lang/String.html * में एक स्ट्रिंग यूटीएफ -16 प्रारूप में एक स्ट्रिंग का प्रतिनिधित्व करता है ... * – adelphus

+0

हाय एडेलफस, धन्यवाद स्पष्टीकरण। मैं गलत हो सकता हूं, लेकिन बस इसके नीचे खोदना चाहता हूं। स्ट्रिंग "हैलो" के लिए, "हैलो" क्यों है .getBytes()। लंबाई मुझे 5 देता है? –

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