मैं जावा में byte[]
से String
को deserialize करने के लिए एक रास्ता तलाश रहा हूं, जितना संभव हो उतना कचरा बनाया गया है। क्योंकि मैं अपना खुद का सीरिएलाइज़र और डी-सीरियलाइज़र बना रहा हूं, मेरे पास सर्वर-साइड (यानी डेटा को क्रमबद्ध करते समय) पर किसी भी समाधान को लागू करने की पूरी स्वतंत्रता है, और क्लाइंट-साइड पर (यानी जब डेटा को डी-सीरियलाइज किया जाता है)।जावा में ज़ीरो-कचरा बड़ा स्ट्रिंग deserialization, humongous ऑब्जेक्ट मुद्दा
मैं कुशलता से serialize एक String
String's
वर्ण (String.charAt(i)
) के माध्यम से पुनरावृत्ति और प्रत्येक char
(16-बिट मूल्य) 8 बिट मूल्य 2 गुना तक परिवर्तित करके किसी भी कचरा भूमि के ऊपर किये बिना में कामयाब रहे। इस here के बारे में एक अच्छी बहस है। एक विकल्प String's
अंतर्निहित सीधे उपयोग करने के लिए प्रतिबिंब का उपयोग करना है, लेकिन यह समस्या के दायरे से बाहर है।
हालांकि, यह मुझे char[]
दो बार, जो लगता है, ठीक है, अजीब बनाए बिना byte[]
deserialize करने के लिए असंभव लगता है।
प्रक्रिया:
byte[]
के माध्यम सेchar[]
- दोहराएं बनाएँ और पूर्ति
char[]
- बनाएं स्ट्रिंग
String(char[])
निर्माता
String
अचल स्थिति नियमों के
, निर्माता के साथ चार [x] प्रतिलिपि बनाते हैं, 2x जीसी ओवरहेड बनाते हैं। मैं हमेशाउदाहरण सेट करने के लिए इस असुरक्षित String
आवंटन + प्रतिबिंब को रोकने के लिए तंत्र का उपयोग कर सकता हूं), लेकिन मैं सिर्फ यह पूछना चाहता था कि String's
अपरिवर्तनीयता पर हर सम्मेलन को तोड़ने से मेरे पास कोई अन्य परिणाम है या नहीं।
बेशक, इसके लिए सबसे बुद्धिमान प्रतिक्रिया "आओ, इसे रोकें और जीसी में भरोसा रखें, मूलबेहद कम रहता है और जी 1 इसे क्षणिक रूप से छुटकारा पायेगा", जो वास्तव में समझ में आता है , यदि char[]
जी 1 के क्षेत्र आकार के 1/2 से छोटा है। यदि यह बड़ा है, तो char [] को एक विशाल वस्तु के रूप में सीधे आवंटित किया जाएगा (यानी स्वचालित रूप से जी 1 के क्षेत्र के बाहर प्रचारित)। जी 1 में एकत्रित कुशलतापूर्वक कचरा होने के लिए ऐसी वस्तुएं बेहद मुश्किल हैं। यही कारण है कि प्रत्येक आवंटन मामलों।
इस मुद्दे से निपटने के तरीके पर कोई विचार?
बहुत धन्यवाद।
क्या आपने स्ट्रिंग्स के साथ काम नहीं किया है और केवल कच्चे बाइट डेटा को क्रमबद्ध कर रहा है और जब यह बिल्कुल जरूरी है तो उपखंडों पर चरित्र सेट रूपांतरण कर रहा है? मेरे पास – the8472
है। मेरा विचार था कि एक नया वर्ग 'म्यूटेबलस्ट्रिंग' बनाना है, और इस पर बहुत से परंपरागत रूप से कचरा-भारी संचालन लागू करना है (उदाहरण के लिए फास्टपाथ 'स्ट्रिंग' स्प्लिट), और फिर एक विधि 'toString (से, से)' बनाता है जो बनाता है एक "दृश्य" उदाहरण जो प्रकार 'स्ट्रिंग' प्रकार का है। मैं वह कर सकता था। लेकिन इसके लिए हमारे आवेदन को पूरी तरह से दोबारा करने और हर जगह संभवतः 'MutableString' का उपयोग करने की आवश्यकता होगी। यह एक अच्छा विचार है, लेकिन मैं पहले विकल्प तलाशना चाहता था। – SergioTCG
क्या आप जानते हैं कि ये सभी चीजें पहले से मौजूद हैं? 'CharBuffer' और' StringBuilder' हैं, दोनों एक प्रकार का उत्परिवर्तनीय 'स्ट्रिंग' (जब तक कि आप एक अपरिवर्तनीय दृश्य नहीं बनाते), उनके हल्के वजन के निर्माण के तरीके हैं और वे सभी' CharSequence', 'इंटरफेस को लागू करते हैं 'जिस पर रेगेक्स पैकेज, जो वास्तव में' स्प्लिट 'ऑपरेशन लागू करता है, पर काम करता है। और जब यह * चरित्र सामग्री की तरह दिखता है, तो 'स्ट्रिंग', 'चारबफर' और 'स्ट्रिंगबिल्डर' के बीच कनवर्ट करते समय स्रोत कोड को देखते समय, हॉटस्पॉट के लिए विशेष अनुकूलन होता है ... – Holger