2011-12-21 6 views
5

मेरे ओपनसीवी एप्लिकेशन में मेमोरी लीक है। इसका एक दर्जन वर्ग और कोड की कुछ हजार लाइनों के साथ एक मध्यम आकार का आवेदन है। किसी भी तरह, मैं अपने आवेदन में एक बड़ी मेमोरी रिसाव का उत्पादन करने में कामयाब रहा कि यह कुछ मिनटों में मेरी सभी 8 जीबी मेमोरी खाती है। मैं सीएमके के साथ उबंटू 11.10 पर ओपनसीवी सी ++ 2.3 का उपयोग कर रहा हूं।ओपनसीवी एप्लिकेशन में, मैं मेमोरी रिसाव के स्रोत की पहचान कैसे करूं और इसे ठीक कर सकता हूं?

An snapshot of how much memory is freed right after I terminate the app. I can watch the used memory go up to 4gig in a matter of a few minutes

यह एक हाथ ट्रैकिंग अनुप्रयोग है और इसे संसाधित दो वीडियो एक फ्रेम दर पर simultaneusly धाराओं के चारों ओर प्रत्येक कैमरे के लिए 15fps।

मैंने नीचे की तरह वालग्रिंड का उपयोग करने की कोशिश की, लेकिन वाल्ग्रिंड का उत्पादन इतना बड़ा है कि बफर में टेक्स्ट खोल की मात्रा से अधिक हो सकता है। मुझे पता है कि मैं आउटपुट को लॉग फ़ाइल में सहेज सकता हूं, लेकिन मैं उम्मीद कर रहा था कि यह सब पढ़ने के कठिन काम से बचें।

valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./Gibbon 

यहाँ valgrind उत्पादन के अंतिम कुछ लाइनों है:: यहाँ valgrind आदेश मैं प्रयोग किया जाता है

==3573== 5,415,576 (1,176 direct, 5,414,400 indirect) bytes in 7 blocks are definitely lost in loss record 2,571 of 2,571 
==3573== at 0x4C28F9F: malloc (vg_replace_malloc.c:236) 
==3573== by 0x5B2ACD0: cv::fastMalloc(unsigned long) (in /usr/local/lib/libopencv_core.so.2.3.1) 
==3573== by 0x5A7FA9D: cvCreateImageHeader (in /usr/local/lib/libopencv_core.so.2.3.1) 
==3573== by 0x484538: CameraPGR::convertImageToOpenCV(FlyCapture2::Image*) (CameraPGR.cpp:212) 
==3573== by 0x483F52: CameraPGR::grabImage() (CameraPGR.cpp:134) 
==3573== by 0x473F86: start() (GibbonMain.cpp:368) 
==3573== by 0x4725CC: main (GibbonMain.cpp:108) 
==3573== 
==3573== LEAK SUMMARY: 
==3573== definitely lost: 24,432 bytes in 33 blocks 
==3573== indirectly lost: 5,414,640 bytes in 15 blocks 
==3573==  possibly lost: 2,314,837 bytes in 1,148 blocks 
==3573== still reachable: 496,811 bytes in 4,037 blocks 
==3573==   suppressed: 0 bytes in 0 blocks 
==3573== 
==3573== For counts of detected and suppressed errors, rerun with: -v 
==3573== Use --track-origins=yes to see where uninitialised values come from 
==3573== ERROR SUMMARY: 336 errors from 318 contexts (suppressed: 10 from 8) 

कुछ बेहतर तरीके है कि मैं इस समस्या को संपर्क कर सकते हैं क्या हैं? क्या ऐसे कुछ उपकरण हैं जो मुझे संक्षेप में दिखा सकते हैं कि कौन से फ़ंक्शन कॉल मेमोरी आवंटन का कारण बन रहे हैं? यदि वालग्रिंड उत्तर है, तो मैं इस उपकरण के लिए बिल्कुल नया हूं क्योंकि इसे अधिक कुशल तरीके से उपयोग करने के तरीके पर कुछ संकेतों की सराहना करता हूं।

+0

बदल दिया जाता है, तो मुझे लगता है कि करने के लिए मैं कहूंगा कि आप शायद कहीं 'CameraPGR आसपास स्मृति आवंटन कर रहे हैं :: grabImage()' और यह कभी नहीं मुक्त कराने के लिए किया था। –

+0

मैंने उस समारोह को कई बार देखा है, वहां समस्या नहीं मिल सकती है। मैं कल इसके साथ कुछ और गड़बड़ कर दूंगा। क्या आपके पास कोई सुझाव है कि मैं स्मृति रिसाव के मूल कारण को खोजने की प्रक्रिया को कैसे सुधार सकता हूं? – Aras

+1

अपने किसी भी कोड को देखे बिना यह गलत हो रहा है कि अनुमान लगाना वास्तव में असंभव है। क्या आप उपर्युक्त कॉलस्टैक में आवंटित स्मृति को मुक्त करते हैं? यदि नहीं, तो आपकी समस्या है। –

उत्तर

5

कोई जवाब नहीं, लेकिन एक सुझाव: ओपनसीवी सी इंटरफेस से सी ++ में ले जाएं। यदि सही ढंग से उपयोग किया जाता है, तो यह अब और भविष्य में रिसाव के अवसरों को कम करेगा। ऑब्जेक्ट्स में एम्बेडेड इसके स्मार्ट पॉइंटर्स स्वचालित रूप से मुफ्त मेमोरी।

सबसे बुरे मामले में, आपके पास एक प्रदर्शन जुर्माना होगा (बहुत सारे ऑलॉक्स/डेलॉक्स), लेकिन उनको प्रोफाइलर में स्थानांतरित करना आसान है।

सी ++ इंटरफ़ेस

Mat intead of IplImage, 
Point instead of CvPoint, 
cv::function() instead of cvFunction. 

उपयोग कर रहा है और आप की जरूरत नहीं है छवियों की ओर इशारा घोषित करने के लिए:

Mat src = imread("myfile.jpg"); 
Mat gray; // note that I do not allocate it. 
// This is done automatically in the next functions 
cv::cvtColor(src, gray, CV_BGR2GRAY); 
imshow("Gray image", gray); 
waitKey(); 

आप कुछ विरासत कोड है, या किसी तीसरे पक्ष के अन्य का उपयोग करता है इंटरफेस, इसे आगे और पीछे कन्वर्ट करने के लिए आसान है:

Mat src(width, height, CV_8UC3); 
IplImage* legacyImg; 
legacyImg = &(IplImage)src; 

अन्य डेटाटाइप्स (जैसे CvPoint) स्वचालित रूप से परिवर्तित हो जाते हैं। CvSeq द्वारा std::vector<T>

+0

सुझाव के लिए धन्यवाद।एक साल पहले मैंने जो कैमरे से लिखा था, उस छवि को छोड़कर, मैं कहीं और सी इंटरफ़ेस का उपयोग नहीं करता हूं। चूंकि मैंने सी ++ इंटरफ़ेस की खोज की है, इसलिए मैं लगातार इसका उपयोग कर रहा हूं। लेकिन फिर भी धन्यवाद! – Aras

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

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