2012-12-31 20 views
5

मैं कुछ "बिग डाटा" सॉफ्टवेयर स्मृति में डेटा का एक बहुत पकड़ की जरूरत है लिख रहा हूँ। मैंने सी ++ में एक प्रोटोटाइप लिखा जो बहुत अच्छा काम करता है। हालांकि वास्तविक अंत उपयोगकर्ता आमतौर पर जावा में कोड करते हैं, इसलिए उन्होंने मुझे जावा प्रोटोटाइप लिखने के लिए कहा है।जावा में स्मृति आकार अनुकूलन

मैं जावा में स्मृति पदचिह्न और कुछ प्रारंभिक परीक्षणों पर पढ़ने पृष्ठभूमि किया है। उदाहरण के लिए, मान लीजिए कि मैं इस वस्तु

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 पूर्णांक सरणियों के रूप में डेटा भंडारण के बाहर कर देता है। सबक: छोटी वस्तुओं में जावा में बुरा आनुपातिक उपरि है।

+3

कुल मेमरी में भी मुफ्त मेमोरी शामिल है, कुल मेमरी() - फ्रीमेमरी() – Henry

+0

के साथ मापने का प्रयास करें, यदि आप वास्तव में सटीक आंकड़े अपने एप्लिकेशन के ढेर डंप लेते हैं और मेमोरी विश्लेषक (http : //www.eclipse.org/mat/) एक सटीक आंकड़ा प्राप्त करने के लिए। दूसरा - इस डेटा तक पहुंच पैटर्न क्या है? हो सकता है कि आप कुछ कैश लाइब्रेरी का उपयोग कर अधिक हेडरूम प्राप्त कर सकें जो अप्रयुक्त भागों को डिस्क पर पेज कर सकता है? अपने अंक 10k वस्तुओं के सरणी में विभाजित करें और infinispan (http://www.jboss.org/infinispan/) या इसी तरह के इन "ब्लॉक" को स्टोर करें? – radai

+0

@ हेनरी अच्छा बिंदु! कुल मेमरी() के साथ मापना - फ्रीमेमरी() प्रति संरचना 36 बाइट्स का मान देता है। 52 से बेहतर, लेकिन फिर भी> सी ++ के 2x। – andyInCambridge

उत्तर

2

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

VisualVM स्क्रीनशॉट दिखाने प्रदर्शन पदचिह्न (http://visualvm.java.net/features.html से छवि): enter image description here

तुम भी चर अंतिम अगर यह संभव है बनाने पर विचार करना चाहिए। यह जावा वीएम को कोड बिट को बेहतर बनाने की अनुमति देता है (सुनिश्चित नहीं है कि यह अंतरिक्ष बचाता है)।

+0

उन्हें अंतिम बनाना एक अच्छा विचार है। बस इसका परीक्षण किया, हालांकि स्मृति पदचिह्न को बदल नहीं है। – andyInCambridge

0

Java में सभी एक वस्तु का प्रथम हमेशा एक C++ संस्करण वस्तु के बाद से तुलना में थोड़ा बड़ा हो जाएगा क्रम प्रकार की जानकारी है कि आप instanceof आदि कि C++ में संभव नहीं है करने के लिए सक्षम बनाता है समाहित। इसके अतिरिक्त यह स्मृति प्रबंधन में सुविधा प्रदान करता है जिसे आपको मैन्युअल रूप से करना होगा, ताकि आप कोड 0 के हिस्से के रूप में अपने C++ कोड के इस भाग पर भी विचार कर सकें।

आप Flyweight Pattern पर गौर ताकि आप पुन: उपयोग DataPoints (कक्षा Immutable बनाने) स्मृति आवश्यकताओं को कम कर सकते हैं। मुझे लगता है कि यदि आपके पास अरबों अंक हैं, जैसा कि आप कहते हैं कि कुछ शायद वही मान होंगे।
मुझे यकीन है कि यहां अन्य लोग मेमोरी स्पेस में ऑप्टिमाइज़ करने पर कुछ और ठोस जानकारी देंगे

0

मूल्य सीमाओं के आधार पर आप छोटे डेटा प्रकारों का उपयोग करने में सक्षम हो सकते हैं। क्या आप कुछ सदस्यों के लिए बाइट या शॉर्ट का उपयोग कर दूर हो सकते हैं?