भारी मात्रा में RAM की आवश्यकता वाले अनुप्रयोगों के लिए C ++ या Java चुनें? [बन्द है]


11

मैं उन वैज्ञानिक अनुप्रयोगों के बारे में सोच रहा हूं जो ज्यादातर प्रोसेसर-बाउंड और हीप उपयोग (कम से कम कई गीगाबाइट) पर भारी हैं। वर्ष के किसी भी समय मैं खुशी से सी ++ के साथ जाऊंगा, लेकिन इस मामले में मुझे आश्चर्य है कि अगर सी ++ मेमोरी मैनेजर के लिए विखंडन प्राकृतिक जावा के कॉम्पैक्टिंग कलेक्टरों के लाभ के लिए एक गंभीर मुद्दा हो सकता है।

क्या कोई इससे संबंधित वास्तविक दुनिया के उदाहरणों की ओर इशारा कर सकता है?


मुझे नहीं लगता कि भाषा इस मामले में प्रोग्रामिंग जितनी महत्वपूर्ण है। आपकी गणना के पैमाने के आधार पर कोई भी परिपक्व भाषा शायद काम कर सकती है। जावस, सी / सी ++, यहां तक ​​कि पायथन और रूबी भी हैं जो इस भूमिका में स्लाइड कर सकते हैं। कुछ दूसरों की तुलना में कठिन होगा क्योंकि ऐसा लगता है कि आपको वास्तव में एक दृढ़ आश्वासन की आवश्यकता है कि आप स्मृति को लीक नहीं कर रहे हैं।
रिग

2
यदि आप $ 7.99 के लिए एक जीबी प्राप्त कर सकते हैं, तो क्या यह एक समस्या है? किंग्स्टन 1GB DDR3
बो पर्सन

2
@BoPersson, मेरे अनुभव में, उन लोगों को इस तरह की समस्याएँ होती हैं जो अपने हाई एंड मदरबोर्ड को पूरी तरह से आबाद करके शुरू करते हैं और शिकायत करते हैं कि वे वहाँ उतना नहीं डाल सकते हैं जितना वे चाहते हैं, और फिर डेटा सेट को प्रबंधनीय के रूप में बड़ा कर देते हैं और फिर शिकायत करते हैं यह पर्याप्त नहीं है।
एपीग्रामग्राम

@dsign, इन दिनों में जहाँ आप 1000 € से कम के लिए कई सैकड़ों गिग्स मेमोरी स्वीकार करने वाले मदरबोर्ड प्राप्त कर सकते हैं, कुछ गिग मेमोरी उपयोग में भारी नहीं है।
एपीग्रामग्राम

1
सस्ते-मेमोरी वाले हिस्से से सहमत हैं। जैसा कि विकास के लिए, मैं थोड़ी देर के लिए सी ++ में रहा हूं और अच्छी कोडिंग प्रैक्टिस रिसाव को एक नहीं बल्कि अभूतपूर्व घटना बनाती है; वास्तव में, मैं वास्तव में उस संबंध में जावा पर सी ++ पसंद करता हूं।
dsign

जवाबों:


11

यदि आप एक ऐसे अनुप्रयोग के बारे में बात कर रहे हैं जो मशीन की सीमाओं को बल देने के लिए बाध्य है , जैसे कि आप अपेक्षा करते हैं कि आप उन सीमाओं से अधिक बचने के लिए प्रोग्रामिंग ट्रिक्स करेंगे, तो C ++ जाने का रास्ता है। न केवल सी ++ आपको अनुकूलन के लिए जगह देता है जहां जावा नहीं करता है, (जैसा कि एमिलियो ने बताया है), लेकिन साथ ही, गारबेज-कलेक्टर्स बहुत मेमोरी भूखे गर्भनिरोधक हैं जिन्हें कुशलतापूर्वक काम करने के लिए अतिरिक्त मुफ्त मेमोरी की बहुत आवश्यकता होती है।

इस सवाल का जवाब: StackOverflow: कचरा संग्रहण के लिए कितनी अतिरिक्त मेमोरी की आवश्यकता होती है ? बल्कि गंभीर तस्वीर को पेंट करें, लेकिन भले ही कचरा इकट्ठा करने वालों को मुफ्त मेमोरी की आवश्यकता हो, जितना कि आवंटित मेमोरी के बारे में हो , (जो मैंने सुना है), इसका मतलब यह है कि जावा के साथ आपको अभी भी बहुत सारी मुफ्त मेमोरी की आवश्यकता होगी इसे कुशलता से चलाने के लिए।

दूसरी ओर, आजकल हम आम तौर पर हार्डवेयर की सीमा को पार करने से बचने के लिए प्रोग्रामिंग ट्रिक करने के बजाय अधिक महंगे हार्डवेयर खरीदना पसंद करते हैं। आपके मामले में, आपकी रैम समस्याएं आमतौर पर 64-बिट मशीन का उपयोग करके और उस पर कई रैम मॉड्यूल को फेंकने से हल हो जाएगी। आप देखें, आजकल की विकसित दुनिया में हार्डवेयर की लागत विकास की लागत के आसपास नहीं है।

मुझे लगता है कि आपको इस विकल्प पर गंभीरता से विचार करना चाहिए, और यदि संभव हो तो, इस विकल्प के साथ और सी ++ के बजाय जावा के साथ जाएं, क्योंकि जावा में सी ++ की तुलना में कुछ विकसित करना और बाद में इसे बनाए रखना बहुत आसान है।


आपके उत्तर के लिए धन्यवाद। मैं आपके हार्डवेयर चित्रण से सहमत हूं।
dsign

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

1
मैं पिछले पैराग्राफ से सहमत नहीं हूँ। जावा को C ++ की तुलना में विकसित करना आसान नहीं है। यह मेरे लिए नहीं होगा, क्योंकि मैंने पिछले पांच या छह वर्षों में बहुत सारे सी ++ और अपेक्षाकृत कम जावा किया है। C ++ और Java दोनों में मेंटेनेंस और अमिट कोड लिखना संभव है।
डेविड थॉर्नले

1
@DavidThornley मैंने 10+ वर्षों के लिए C / C ++ और 6+ वर्षों के लिए Java किया है। मुझे लगता है कि जावा को सभी मामलों में आसान होना चाहिए: प्रोटोटाइपिंग, विकास, विस्तार, और रखरखाव। लेकिन किसी भी मामले में, यही राय करने के लिए हैं: अलग । C -: =
माइक नकिस

क्या आप में से किसी ने एक बिग-डेटा, प्रोसेसर-भूखा प्रोजेक्ट के लिए प्रोग्राम किया है? वहाँ कोई टिप्पणी?
dsign

7

समस्या C ++ का उपयोग नहीं है क्योंकि यह जावा है और जावा का उपयोग नहीं है क्योंकि यह C ++ है। एक C ++ कंटेनर सामान्य रूप से विखंडन की अधिकता से बचने के लिए लागू किया जाता है, ठीक उसी तरह जैसे जावा फ्री स्टोर करते हैं।

लेकिन अगर आप खुद को सीधे मेमोरी आवंटित करते हैं, तो आप उन चीजों को भी कर सकते हैं जो जावा आपको करने की अनुमति नहीं देता है, जिसके परिणामस्वरूप विखंडन हो सकता है।

उचित समाधान (C ++ में) एलोकेटर वर्गों के माध्यम से कंटेनर और स्मार्ट-पॉइंटर्स का उपयोग होता है जो कि निश्चित "plexes" (मुख्य बिंदु, यहां एक अच्छा आवंटन वर्ग लिख रहा है) के माध्यम से आवंटन का प्रबंधन करता है। और यह एक प्रोग्रामिंग शैली है जिसका जावा से कोई लेना-देना नहीं है, इसलिए कोई भी तुलना अर्थहीन है।

[संपादित करें] यह एक पुराना नमूना हो सकता है: निश्चित आवंटन


आपके उत्तर के लिए धन्यवाद एमिलियो। मुझे C ++ के लचीलेपन के बारे में अच्छी तरह से पता है और मैं आपसे सहमत हूँ। फिर, मैं कुछ वास्तविक-उपयोग के उदाहरणों को जानना चाहूंगा जहां इन तकनीकों का उपयोग सफलता के लिए किया गया है।
dsign

@dsign: पोस्ट संपादित किया गया है, लिंक देखें
एमिलियो गरवाग्लिया

1
मैंने पहले इन तकनीकों का उपयोग किया था। खराब प्रदर्शन करने वाले ऐप के पास इसके आवंटनकर्ता निश्चित-ब्लॉक हीप्स के सेट का उपयोग करने के लिए बदल गए थे। इसलिए जब आप 4 बाइट ब्लॉक चाहते थे, तो यह ढेर से आया जो केवल 4-बाइट ब्लॉक को संग्रहीत करता था। यदि आप 5 बाइट्स चाहते हैं, तो यह 8-बाइट ब्लॉक हीप, आदि से आया है। प्रदर्शन में वृद्धि (हमारे भारी आवंटन वाले ऐप के लिए) जबरदस्त थी। आपको परिणाम उतना अच्छा नहीं मिल सकता है, लेकिन यह बहुत प्रभावी हो सकता है। सभी खंड निश्चित ब्लॉकों में आने के साथ ही शून्य विखंडन भी था।
gbjbaanb

2

कचरा संग्रह का लाभ यह है कि यह एक मशीन को अनंत मात्रा में मेमोरी के साथ अनुकरण करता है। उस अमूर्त के तंत्र या कार्यान्वयन का उद्देश्य प्रोग्रामर के रूप में आपके लिए पूरी तरह से पारदर्शी होना है। हम सभी जानते हैं कि तंत्र स्मृति को पुनः प्राप्त कर रहा है जो अब प्रोग्राम द्वारा उपयोग नहीं किया जाता है, लेकिन वास्तव में इसकी गारंटी नहीं है। यदि आप प्रोग्राम को वास्तव में उपयोग करने वाले प्रोग्राम की तुलना में अधिक रैम वाले मशीन पर चलाते हैं, तो कचरा संग्रह कभी भी नहीं हो सकता है। फिर, अप्रासंगिक, क्योंकि आप प्रोग्राम को बिना इस बात के लिख सकते हैं कि वह किस तरह से मेमोरी का उपयोग करता है। जब भी प्रोग्राम अनुरोध करेगा, मेमोरी मैनेजर अधिक रैम आवंटित करेगा, और आपको यह मानने की अनुमति होगी कि इस तरह के आवंटन हमेशा सफल होंगे। जावा एक कचरा एकत्र करने वाली भाषा है, और C ++ नहीं है। 1

कचरा संग्रहण का नुकसान यह है कि सभी सार की तरह , यह टपका हुआ है। यह हमेशा पूरी तरह से हर समय काम नहीं करता है, विशेष रूप से किनारे के मामलों में, और आपको कीड़े में चलने की संभावना है। जिन लोगों ने कचरा संग्रह एल्गोरिथ्म लिखा था (एक जिसे प्रोग्रामर के रूप में आपके लिए पारदर्शी माना जाता है) सबसे आम मामलों के लिए अनुकूलित है, और सामान्य मामलों के साथ परेशानी यह है कि वे कभी भी आम नहीं होते हैं। सामान्य तौर पर , आप मेमोरी के प्रबंधन में कचरा संग्रहकर्ता की तुलना में कोई बेहतर नहीं कर सकते। लेकिन विशिष्ट परिस्थितियों में (और पर्याप्त मात्रा में समय, ऊर्जा और समझ को देखते हुए) यह संभव हो सकता है। सी ++ आपको यह लचीलापन देता है; जावा नहीं करता है

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

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

और फिर आपको खुद से यह भी पूछना होगा कि क्या यह वास्तव में मायने रखता है। बो की स्नाइड टिप्पणी के लिए सच्चाई का एक संकेत से अधिक है: स्मृति अब बहुत सस्ती है, यह शायद ही बहुत अधिक हाथ से लिखे जाने लायक है। यहां तक ​​कि अगर आपको बड़े पैमाने पर राशि की आवश्यकता है , तो वे राशि लगभग उतनी बड़े पैमाने पर नहीं हैं जितनी 10 साल पहले थीं। प्रोग्रामर और एप्लिकेशन डेवलपमेंट सिर्फ रैम और प्रोसेसिंग पॉवर के gobs खरीदने से कहीं अधिक महंगे हैं। इसका मतलब यह नहीं है कि आपको अर्थव्यवस्था को जहां संभव हो बचाना चाहिए, लेकिन इसका मतलब यह है कि आपको इसे करने में बहुत समय बर्बाद नहीं करना चाहिए।


1 बेशक, यह धारणा सवाल में एक गहरी खामी को उजागर करती है। जैसा कि यह पता चला है, "जावा या सी ++" थोड़ा लाल हेरिंग है। मानक जावा कार्यान्वयन कचरा संग्रहण प्रदान करता है और C ++ भाषा के मानक के अनुसार नहीं है, लेकिन इसका कोई कारण नहीं है कि आप C ++ के लिए किसी तृतीय-पक्ष कचरा कलेक्टर का उपयोग नहीं कर सकते। बहुत सी कंपनियों ने इन चीजों को बेचकर जीवनयापन किया है, और कुछ ने संभवत: मुफ्त में अपना जीवनयापन कर लिया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.