2013-05-03 10 views
9

मैं उबंटू 12.04 (सटीक) 64-बिट पर आर 2.15.3 का उपयोग कर रहा हूं। अगर मैं valgrind में आर चलाएँ: --vanillaमेरी आर मेमोरी लीक है?

आर -d "valgrind" मैं फिर q() का उपयोग कर कार्यक्रम से बाहर निकलें और मैं निम्नलिखित रिपोर्ट प्राप्त:

==7167== HEAP SUMMARY: 
==7167==  in use at exit: 28,239,464 bytes in 12,512 blocks 
==7167== total heap usage: 28,780 allocs, 16,268 frees, 46,316,337 bytes allocated 
==7167== 
==7167== LEAK SUMMARY: 
==7167== definitely lost: 120 bytes in 2 blocks 
==7167== indirectly lost: 480 bytes in 20 blocks 
==7167==  possibly lost: 0 bytes in 0 blocks 
==7167== still reachable: 28,238,864 bytes in 12,490 blocks 
==7167==   suppressed: 0 bytes in 0 blocks 
==7167== Rerun with --leak-check=full to see details of leaked memory 
==7167== 
==7167== For counts of detected and suppressed errors, rerun with: -v 
==7167== Use --track-origins=yes to see where uninitialised values come from 
==7167== ERROR SUMMARY: 385 errors from 5 contexts (suppressed: 2 from 2) 

हाल ही में आर अक्सर दुर्घटनाग्रस्त हो रहा है, खासकर जब मैं आरसीपीपी के माध्यम से सी ++ कार्यों को कॉल करता हूं, क्या यह कारण हो सकता है? धन्यवाद!

उत्तर

10

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

आप एक रिसाव को देखने के लिए, एक बनाने के उदाहरण के लिए, इस तरह की एक फ़ाइल के साथ करना चाहते हैं:

library(Rcpp) 
cppFunction('int leak(int N) {double *ptr = (double*) malloc(N*sizeof(double)); \ 
      return 0;}') 
leak(10000) 

जो स्मृति सुरक्षित रखता है आर के पहुंच से बाहर भी स्पष्ट रूप से, है, और फिर बाहर निकालता है। यहाँ हम पाते हैं:

$ R -d "valgrind" -f /tmp/leak.R 
[...] 
R> leak(10000) 
[1] 0 
R> 
==4479== 
==4479== HEAP SUMMARY: 
==4479==  in use at exit: 35,612,126 bytes in 15,998 blocks 
==4479== total heap usage: 47,607 allocs, 31,609 frees, 176,941,927 bytes allocated 
==4479== 
==4479== LEAK SUMMARY: 
==4479== definitely lost: 120 bytes in 2 blocks 
==4479== indirectly lost: 480 bytes in 20 blocks 
==4479==  possibly lost: 0 bytes in 0 blocks 
==4479== still reachable: 35,611,526 bytes in 15,976 blocks 
==4479==   suppressed: 0 bytes in 0 blocks 
==4479== Rerun with --leak-check=full to see details of leaked memory 
==4479== 
==4479== For counts of detected and suppressed errors, rerun with: -v 
==4479== Use --track-origins=yes to see where uninitialised values come from 
==4479== ERROR SUMMARY: 31 errors from 10 contexts (suppressed: 2 from 2) 
$ 

अब वहाँ एक रिसाव का एक सा अधिक है (हालांकि यह अभी भी रूप में आसानी से पढ़ने योग्य के रूप में एक आशा नहीं है)। यदि आप सुझाए गए झंडे जोड़ते हैं, तो अंत में यह malloc() कॉल को इंगित करेगा।

इसके अलावा, मेरे पास 'एचपीसी के साथ एचआरसी के साथ परिचय' स्लाइड सेट में से एक में सीआरएएन पैकेज के पहले संस्करण में वास्तविक रिसाव का एक उदाहरण उदाहरण है। यदि और रिसाव होने पर, यह मदद करता है। जब कोई नहीं होता है, तो शोर के माध्यम से देखना कठिन होता है।

तो संक्षेप में, यदि आप कोड क्रैश करते हैं, तो शायद यह आपके कोड की गलती है। एक न्यूनतम प्रतिलिपि उदाहरण का प्रयास करें (अच्छी) मानक सलाह है।

+0

धन्यवाद! मैंने वाल्ग्रिंड आउटपुट को काफी भ्रमित पाया। मुझे लीक के बारे में संदेह होना शुरू हो गया क्योंकि केवल आरसीपीपी फ़ंक्शन को कॉल करना: न्यूमेरिकमैट्रिक्स myMat (int nCols, int nRows) { न्यूमेरिकमैट्रिक्स आउट (nRows, nCols); वापस लौटें; } कभी-कभी आर को लूप में क्रैश करने का कारण बनता है यदि मैं इस कार्य को आर आर लूप में क्रमशः कॉल करता हूं: (ii में 1: 10^6) चटाई <- myMat (100, 100) –

+0

यदि आप एक सेगफॉल्ट को पुन: पेश कर सकते हैं , और शायद 'gdb' के तहत चलाया जा सकता है, तो हम संभवतः चीजों को बेहतर बना सकते हैं। अन्यथा, यह लगभग असंभव है। –

+0

आप सही हैं, अगर मैं त्रुटि को पुन: उत्पन्न करने का प्रबंधन करता हूं तो मैं इसे किसी अन्य प्रश्न में पोस्ट करूंगा। धन्यवाद –

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