पर C++ का उपयोग करके ढेर पर 2 जीबी से अधिक आवंटित करें यह एक बहुत ही आम समस्या प्रतीत होता है, लेकिन फिर भी मुझे एक निश्चित उत्तर नहीं मिला है।32 बिट लिनक्स कर्नेल
मैं जो लिनक्स चलाता है एक सर्वर के लिए उपयोग किया, राम के 16 जीबी और एक 16-कोर (64 बिट) सीपीयू (/ proc/cpuinfo देता है "इंटेल (आर) जिऑन (आर) सीपीयू E5520 @ 2.27GHz" है)। हालांकि, कर्नेल 32 बिट है (uname -m i686 देता है)। बेशक, मेरे पास रूट रूट नहीं है, इसलिए मैं को बदल नहीं सकता।
मैं एक सी ++ चला रहा हूँ - कार्यक्रम मैंने लिखा है, जो कुछ स्मृति के भूखे गणना करता है, तो मैं मैं एक बड़े ढेर की जरूरत है - लेकिन जब भी मैं 2GB से अधिक हिस्सा आवंटित करने की कोशिश, मैं एक badalloc, हालांकि ulimit लाभ प्राप्त "असीमित"।
#include <iostream>
#include <vector>
int main() {
int i = 0;
std::vector<std::vector<int> > vv;
for (;;) {
++i;
vv.resize(vv.size() + 1);
std::vector<int>* v = &(vv.at(vv.size() - 1));
v->resize(1024 * 1024 * 128);
std::cout << i * 512 << " MB.\n";
}
return 0;
}
जी ++ (कोई भी निशानी) के साथ संकलन के बाद, उत्पादन होता है: सादगी के लिए, हम सिर्फ इतना कहना मेरा कार्यक्रम यह है जाने
512 MB.
1024 MB.
1536 MB.
2048 MB.
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted
जहां तक मैं समझता हूँ, इस की एक सीमा है 32 बिट सिस्टम, जाहिर है क्योंकि 32 बिट पॉइंटर केवल 2^32 अलग-अलग एड्रेस धारण कर सकता है (क्या मुझे लगता है कि अगर मैंने उसी सर्वर पर एक ही प्रोग्राम संकलित किया है, लेकिन उस सर्वर ने 64 बिट कर्नेल चलाया है, तो प्रोग्राम अधिक आवंटित कर सकता है 2 जीबी से?)
यह सवाल नहीं है कि आवंटित स्मृति संगत है, अगर मैं उदाहरण प्रोग्राम में पतला टुकड़ा करता हूं, तो वही समस्या होती है, और मेरे वास्तविक कार्यक्रम में मेमोरी का कोई बड़ा ब्लॉक नहीं है, केवल बहुत छोटे ।
तो मेरा प्रश्न है: क्या मैं कुछ भी कर सकता हूं? मैं ओएस नहीं बदल सकता, लेकिन निश्चित रूप से मैं अपने स्रोत कोड को संशोधित कर सकता हूं, विभिन्न कंपाइलर विकल्प आदि का उपयोग करें ... लेकिन मुझे 2 जीबी से अधिक मेमोरी की आवश्यकता है, सभी एक बार में, और अनुकूलित करने के लिए कोई स्पष्ट तरीका नहीं है कार्यक्रम का उपयोग करने वाले एल्गोरिदम।
यदि उत्तर स्पष्ट "नहीं" है, तो यह अभी भी जानना अच्छा होगा।
धन्यवाद, लुकास
(1) एक 64 बिट ओएस और स्थानीय एप्लिकेशन का उपयोग करें। (2) [भौतिक पता एक्सटेंशन] सक्षम करें (http://en.wikipedia.org/wiki/Physical_Address_Extension#Operating_system_support) लक्ष्य मशीन पर समर्थन 32 बिट है। यह आपको काम करने के लिए एक अतिरिक्त जीबी खरीदना चाहिए। इस बात का लघु (जो ऐसा लगता है कि आप कुछ बहुत संकीर्ण संभावनाओं में पिन हो रहे हैं) एक स्व-प्रबंधित डिस्क पृष्ठ प्रणाली के अपने ही एकमात्र विकल्प हो सकता है। – WhozCraig
* क्या मुझे लगता है कि यदि मैंने एक ही सर्वर पर एक ही प्रोग्राम को संकलित किया है, तो क्या यह सर्वर 64 बिट कर्नेल चला गया है, प्रोग्राम 2 जीबी से अधिक आवंटित कर सकता है? * - हाँ। आप * स्विच के साथ थोड़ा अधिक (शायद 3.5 जीबी या उससे भी अधिक) की तलाश कर सकते हैं। अनिवार्य रूप से, हालांकि आपने स्केलेबिलिटी समस्या को मारा है और यदि आप वास्तव में समय के साथ प्रसंस्करण को विभाजित नहीं कर पाते या सीमा को मारने से बचने के लिए प्रक्रिया है तो आपको 64 बिट पर जाना होगा। –
क्या वह कई प्रक्रियाओं को 2 जीबी आवंटित करके इस समस्या को हल कर सकता है। फिर आवश्यकतानुसार अन्य प्रक्रिया के मेमोरी हिस्सों में डेटा पढ़ने/लिखने के लिए एक आईपीसी तंत्र का आविष्कार किया? या बस memcached के एक या एक से अधिक उदाहरण चलाते हैं? – selbie