के लिए यूटीएफ -8 स्ट्रिंग क्लास मुझे मेमोरी (सैकड़ों एमबी) में बहुत सारी स्ट्रिंग ऑब्जेक्ट्स रखने की आवश्यकता है और मैं उन्हें यूटीएफ -8 प्रारूप में पकड़ना चाहता हूं क्योंकि ज्यादातर मामलों में इसे स्मृति के आधे मेमोरी को डिफ़ॉल्ट कार्यान्वयन की आवश्यकता होगी उपयोग।
डिफ़ॉल्ट स्ट्रिंग क्लास को 12 वर्ण स्ट्रिंग 60 बाइट्स की आवश्यकता होती है (http://blog.griddynamics.com/2010/01/java-tricks-reducing-memory-consumption.html देखें)।
मेरे अधिकांश स्ट्रिंग्स 10-20 वर्ण लंबे हैं।
मुझे आश्चर्य है कि क्या कुछ ओपन सोर्स लाइब्रेरी है जो इस तरह के तारों के लिए एक रैपर प्रदान करती है?
मुझे पता है कि स्ट्रिंग को यूटीएफ -8 बाइट सरणी में कैसे परिवर्तित किया जाए, लेकिन मैं एक रैपर क्लास की तलाश में हूं जो सभी आवश्यक उपयोगिताओं के कार्यों (हैश, समान, टूस्ट्रिंग, स्ट्रिंग, इत्यादि) प्रदान करेगा।जावा
Q
जावा
6
A
उत्तर
2
अपाचे एवरो है एक UTF8 wrapper class जो CharSequence
लागू करता है, लेकिन मैं इस तरह की वस्तुओं
Hadoop Text class जो काफी इंटरफ़ेस की तरह है आप
0
की इच्छा आप एक चाहते हैं है प्रत्येक स्ट्रिंग के लिए अलग वस्तु और आप उन्हें यथासंभव कॉम्पैक्ट के रूप में चाहते हैं तो बाइट एरे का उपयोग करें। यह 1 बाइट प्रति चार बनाम 2 होगा, और आपके पास स्ट्रिंग हेडर का ओवरहेड नहीं होगा (जो प्रति ऑब्जेक्ट 32 बाइट जोड़ता है)।
लेकिन निश्चित रूप से आप पहले स्ट्रिंग में कनवर्ट किए बिना इन स्ट्रिंग विधियों का उपयोग करने में सक्षम नहीं होंगे।
लेकिन यदि आप वास्तव में अंतरिक्ष को सहेजना चाहते हैं, तो तारों को अलग-अलग तारों का पता लगाने के लिए "डोप वैक्टर" के साथ कुछ बड़े सरणी में बैक-टू-बैक स्टोर करें।
http://docs.oracle.com/javase/tutorial/i18n/text/string.html – Doorknob
जावा यूटीएफ -16 में आंतरिक रूप से सभी तारों को स्टोर करता है, इसलिए आप 12 वर्ण स्ट्रिंग आंतरिक रूप से 24 बाइट्स हैं। अनिवार्य वस्तु ओवरहेड की गिनती नहीं, वह 60 बाइट आकृति कहां से आती है? – fge
... यूटीएफ एन्कोडिंग के रूप में न्यूनतम 24 बाइट्स वेरिएबल लम्बाई हैं (दी गई है, आपको ओपी के उदाहरण में 24 बाइट्स से अधिक होने के लिए कुछ गंभीर विदेशी पात्रों का उपयोग करना होगा) –