मैं कुछ "बिग डाटा" सॉफ्टवेयर स्मृति में डेटा का एक बहुत पकड़ की जरूरत है लिख रहा हूँ। मैंने सी ++ में एक प्रोटोटाइप लिखा जो बहुत अच्छा काम करता है। हालांकि वास्तविक अंत उपयोगकर्ता आमतौर पर जावा में कोड करते हैं, इसलिए उन्होंने मुझे जावा प्रोटोटाइप लिखने के लिए कहा है।जावा में स्मृति आकार अनुकूलन
मैं जावा में स्मृति पदचिह्न और कुछ प्रारंभिक परीक्षणों पर पढ़ने पृष्ठभूमि किया है। उदाहरण के लिए, मान लीजिए कि मैं इस वस्तु
public class DataPoint{
int cents, time, product_id, store_id;
public DataPoint(int cents, int time, int product_id, int store_id){
this.cents = cents;
this.time = time;
this.product_id = product_id;
this.store_id = store_id;
}
}
C++ में sizeof इस संरचना 16 बाइट्स की है, जो समझ में आता है की है। जावा में हमें अप्रत्यक्ष होना है। अगर मैं बनाने के लिए, उदाहरण के लिए, इन वस्तुओं में से 10 मी और Runtime.totalMemory() का उपयोग - पहले और बाद में Runtime.freeMemory() और फिर के रूप में उपयुक्त मैं प्रति संरचना लगभग 36 बाइट्स मिल विभाजित करते हैं। एक ~ 2.4x स्मृति अंतर बहुत बुरा है; जब हम स्मृति में लाखों डेटापॉइंट्स रखने की कोशिश करते हैं तो यह बदसूरत हो जाएगा।
मैंने कहीं पढ़ा है कि जावा में इस तरह के मामलों में अपनी बेहतर सरणियों के रूप में डाटा स्टोर करने - अनिवार्य रूप से एक स्तंभ आधारित बजाय एक पंक्ति आधारित दुकान की दुकान। मुझे लगता है कि मैं इसे समझता हूं: कॉलम-आधारित तरीका संदर्भों की संख्या को कम करता है, और शायद JVM भी इंट को 8-बाइट शब्दों में बुद्धिमानी से पैक कर सकता है।
मेमोरी-पदचिह्न को कम करने के लिए मैं कौन सी अन्य चाल का उपयोग कर सकता हूं जो अनिवार्य रूप से एक स्मृति ब्लॉक है जिसमें एक बहुत बड़ा आयाम (लाखों/डेटापॉइंट्स) और एक बहुत छोटा आयाम (ओ (1) स्तंभों की संख्या है /चर)?
प्रविष्टि प्रति वास्तव में 16 बाइट्स इस्तेमाल किया 4 पूर्णांक सरणियों के रूप में डेटा भंडारण के बाहर कर देता है। सबक: छोटी वस्तुओं में जावा में बुरा आनुपातिक उपरि है।
कुल मेमरी में भी मुफ्त मेमोरी शामिल है, कुल मेमरी() - फ्रीमेमरी() – Henry
के साथ मापने का प्रयास करें, यदि आप वास्तव में सटीक आंकड़े अपने एप्लिकेशन के ढेर डंप लेते हैं और मेमोरी विश्लेषक (http : //www.eclipse.org/mat/) एक सटीक आंकड़ा प्राप्त करने के लिए। दूसरा - इस डेटा तक पहुंच पैटर्न क्या है? हो सकता है कि आप कुछ कैश लाइब्रेरी का उपयोग कर अधिक हेडरूम प्राप्त कर सकें जो अप्रयुक्त भागों को डिस्क पर पेज कर सकता है? अपने अंक 10k वस्तुओं के सरणी में विभाजित करें और infinispan (http://www.jboss.org/infinispan/) या इसी तरह के इन "ब्लॉक" को स्टोर करें? – radai
@ हेनरी अच्छा बिंदु! कुल मेमरी() के साथ मापना - फ्रीमेमरी() प्रति संरचना 36 बाइट्स का मान देता है। 52 से बेहतर, लेकिन फिर भी> सी ++ के 2x। – andyInCambridge