2010-12-29 16 views
7


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

using namespace std;  
vector<vector<vector<MyBase*> > >* data; 

यह बाद में यह एक करने के लिए एक कोड एनालॉग के साथ धारावाहिक है:

ar & BOOST_SERIALIZATION_NVP(data); 

बढ़ावा/क्रमबद्धता/vector.hpp शामिल है।

कक्षाओं को "माईबेस" से सभी उत्तराधिकारी क्रमबद्ध किया जा रहा है।
अब, मेरी परियोजना की शुरुआत के बाद से मैंने सामान्य बाइनरी_आर्किव, टेक्स्ट, एक्सएमएल और अंततः पॉलिमॉर्फिक बाइनरी/एक्सएमएल/टेक्स्ट से सीरियलाइजेशन के लिए अलग-अलग अभिलेखागार का उपयोग किया है। इनमें से प्रत्येक एक ही तरह से कार्य करता है।

आम तौर पर यह एक समस्या नहीं होगी यदि मुझे थोड़ी मात्रा में डेटा क्रमबद्ध करना पड़ा लेकिन मेरे पास कक्षाओं की संख्या मिलियन (आदर्श रूप से लगभग 10 मिलियन) है और स्मृति उपयोग के रूप में मैं इसका परीक्षण करने में सक्षम हूं लगातार दिखाता है कि कोड लिखने के दौरान कोड :: बूस्ट :: क्रमबद्धता भाग द्वारा आवंटित स्मृति फ़ाइल लिखते समय पूरे स्मृति पदचिह्न के लगभग 2/3 है।

यह 4 मिलियन जीबी रैम के लिए लिया गया है जो 4 मिलियन ऑब्जेक्ट्स के लिए लिया जाता है जहां ऑब्जेक्ट्स स्वयं 4.2 जीबी लेते हैं। अब तक यह है कि मैं अपना कोड लेने में सक्षम हूं क्योंकि मेरे पास 8 जीबी से अधिक भौतिक RAM वाली मशीन तक पहुंच नहीं है। मुझे यह भी ध्यान रखना चाहिए कि यह एक 64 बिट एप्लिकेशन विंडोज 7 पेशेवर x64 संस्करण पर चल रहा है लेकिन स्थिति उबंटू बॉक्स पर समान है।

किसी को भी यह पता है कि मैं इसे समस्या निवारण के बारे में कैसे जाना चाहूंगा क्योंकि यह मेरे लिए ऐसी अनुप्रयोग के लिए ऐसी उच्च स्मृति आवश्यकताएं अस्वीकार्य है जो धारावाहिक करते समय चलने के दौरान जितनी मेमोरी का उपयोग नहीं करेगा।

Deserialization उतना बुरा नहीं है, क्योंकि यह आवश्यक स्मृति के लगभग 1.5 गुना आवंटित करता है। यह ऐसा कुछ है जिसके साथ मैं रह सकता हूं।

बूस्ट :: संग्रह :: archive_flags :: no_tracking के साथ ट्रैकिंग बंद करने का प्रयास किया लेकिन यह बिल्कुल वही कार्य करता है।

किसी को भी कोई विचार है कि मुझे क्या करना चाहिए?

+0

बस इस विषय को टक्कर देने के लिए जांच कर रहा है क्योंकि किसी ने अभी तक जवाब नहीं दिया है ... – Max021

+0

दिलचस्प विषय। इसे पढ़ें: http: // stackoverflow।कॉम/प्रश्न/1058051/बूस्ट-सीरियलाइजेशन-प्रदर्शन-टेक्स्ट-बनाम-बाइनरी-प्रारूप –

+0

'नो_ट्रैकिंग' ध्वज दुर्भाग्य से कार्यान्वित नहीं किया गया है (इसके बारे में समस्या ट्रैकर पर कुछ चर्चा है)।/सीसी @MohsenTamiz – sehe

उत्तर

1

वालग्रिंड का उपयोग करके मुझे पता चला कि मेमोरी खपत का मुख्य कारण लाइब्रेरी के अंदर पॉइंटर्स को ट्रैक करने के लिए एक नक्शा है। यदि आप निश्चित हैं कि आपको पॉइंटर ट्रैकिंग की आवश्यकता नहीं है (इसका मतलब है कि आप सुनिश्चित हैं कि कोई सूचक एलियासिंग नहीं है) अक्षम ट्रैकिंग। आप अक्षम ट्रैकिंग की मुख्य अवधारणाओं को here पा सकते हैं। संक्षेप में आप कुछ इस तरह करना चाहिए:

BOOST_CLASS_TRACKING(vector<vector<vector<MyBase*> > >, boost::serialization::track_never) 

my question में मैं इस मैक्रो है कि आप एक टेम्पलेट वर्ग के ट्रैकिंग अक्षम कर सकता है के एक संस्करण में लिखा था। यह आपकी स्मृति खपत पर एक महत्वपूर्ण प्रभाव होना चाहिए। यह भी ध्यान दें कि किसी भी कंटेनर के अंदर पॉइंटर्स हैं यदि आप ट्रैकिंग करना चाहते हैं तो आपको भी उन्हें ट्रैक करना अक्षम नहीं करना चाहिए। वर्तमान में मुझे यह ठीक से करने का कोई तरीका नहीं मिला।

+0

जब तक, आपको पाठ्यक्रम की ट्रैकिंग की आवश्यकता नहीं है। (आप serialization अक्षम करके अधिक स्मृति बचा सकते हैं)। असली समाधान यहां पॉइंटर सीरियलाइजेशन का उपयोग नहीं करना होगा – sehe

+0

टेम्पलेट कक्षाओं के लिए "अच्छा" मैक्रो के लिए उपरोक्त (अच्छी तरह से, यह एक मैक्रो है; मैंने अब तक आंशिक विशेषज्ञता का उपयोग किया है) – sehe

संबंधित मुद्दे