2016-02-19 12 views
6

मैं एक मैटलैब प्रोग्राम लिख रहा हूं, जो लगभग 500 फाइलें पढ़ता है। प्रत्येक फ़ाइल में 20,000 लाइनें होती हैं, प्रत्येक पंक्ति पर 1 संख्या होती है। कार्यक्रम इन नंबरों के साथ 20,000 * 500 का मैट्रिक्स बनाने की कोशिश करता है। संख्याएं डबल के रूप में संग्रहित की जाती हैं, इसलिए प्रति संख्या 8 बाइट्स। तो मैं उम्मीद करता हूं कि यह 20,000 * 500 * 8 बाइट्स लेगा, जो लगभग 1E8 है, यानी 100 एमबी। और फिर भी यह कार्यक्रम मेरी 16 जीबी मेमोरी समाप्त करता है। जैसे-जैसे प्रोग्राम चलता है, मैं देखता हूं कि मेमोरी का उपयोग तेजी से बढ़ रहा है, जीबी द्वारा जीबी। मैं उबंटू 14.04 पर मैटलैब आर2015 बी का उपयोग कर रहा हूं।मेरा मैटलैब प्रोग्राम इतना मेमोरी क्यों उपयोग करता है?

क्या हो रहा है? आपके ध्यान के लिए बहुत धन्यवाद।

यहाँ पूर्ण कोड

clear all; 
% number of rna bits in the file 
filesize = 20532 

maxFiles = 480; 
rnaCounts = NaN(filesize,maxFiles); 

myFolder = '~/_STATS/data3/RNASeqV2/UNC__IlluminaHiSeq_RNASeqV2/Level_3'; 
filePattern = fullfile(myFolder, '*genes.normalized_results'); 

theFiles = dir(filePattern); 

rnaCounts = NaN(filesize,length(theFiles)); 


for k = 1 : length(theFiles) 
    mrnaFilename = strtrim(theFiles(k).name); 
    fprintf(1, 'Now reading mrnaFile %d %s \n', k, mrnaFilename); 

    % read rna file 
    fullFileName = fullfile(myFolder, mrnaFilename); 
    rnafid = fopen(fullFileName); 

    if rnafid < 0 
     fprintf('====ERROR OPENING RNA FILE ====================='); 
    end 
    rnaline = fgets(rnafid); 

    lc = 1; % line counter 
    while ischar(rnaline) && feof(rnafid) ~= 1 
     rnaline = fgets(rnafid); 
     rnaSplit = strsplit(rnaline); 

     % write to the matrix 
     rnaCounts(lc,k) = str2num(rnaSplit{2}); 

     lc = lc + 1; 
    end 
    fclose(rnafid); 

end 
+0

कोशिश करने की एक चीज़ 'rnaCounts' के पहले उदाहरण को हटा दें; यह अप्रयुक्त और बहुत बड़ा है, हालांकि यह स्मृति को उड़ाने वाला नहीं होना चाहिए। – drhagen

+0

इसके अलावा, 'str2num' की बजाय 'str2double' आज़माएं। यह बिल्कुल 'str2num' नहीं था। 'help str2num' और' help str2double' – drhagen

+0

क्या आप वाकई मैटलैब द्वारा मेमोरी आयोजित कर रहे हैं और न केवल फाइल सिस्टम कैश है? जैसे यदि आप मैटलैब को मार देते हैं, तो क्या सभी मेमोरी तुरंत साफ़ हो जाती है? – drhagen

उत्तर

3

ओपी द्वारा सत्यापित के रूप में है, मैटलैब 2015b का लिनक्स संस्करण में str2num समारोह एक स्मृति रिसाव है। यह फ़ंक्शन वैसे भी बहुत उपयोगी नहीं है क्योंकि इसे एकल मैट्रिस (1 2; 3 4) का प्रतिनिधित्व करने वाले तारों को पार्स करने के लिए डिज़ाइन किया गया है, जो एक एकल संख्या (1.234) को पार्स करने के सामान्य उपयोग मामले की बजाय है। सरल संख्या पार्सिंग करते समय str2double का उपयोग करें; यह तब भी तेज़ है जब str2num टूटा नहीं जाता है।

ऐसा लगता है कि मैटलैब के एक अलग संस्करण का उपयोग समस्या के आसपास भी काम करेगा, क्योंकि मेरे अनुभव में, इस प्रकार की मेमोरी बग आमतौर पर एक संस्करण से अगले संस्करण तक नहीं रहती है।

1

अक्सर, उच्च स्तरीय I/O फ़ंक्शन, जैसे कि dlmread या textscan ऐसे टेक्स्ट प्रारूपों को पढ़ने के लिए उपयोगी हैं। dlmread का उपयोग करें यदि आपके पास अधिक जटिल प्रारूपों के लिए केवल संख्यात्मक डेटा, और textscan है।

नमूना डेटा आपके द्वारा दी गई है:

A2LD1|87769 135.5735

आप केवल दूसरे कॉलम में संख्या की जरूरत है और पहले कॉलम में पहचानकर्ता त्यागने के रूप में, आपके पास संख्यात्मक डेटा है, और आप dlmread का उपयोग कर सकते हैं।

data = dlmread(fullFileName, '\t', 1, 1); 

\t निर्दिष्ट करने के लिए कि सीमांकक (स्तंभ विभाजक) एक टैब है। दो 1 एस एक पंक्ति ऑफसेट और कॉलम ऑफ़सेट निर्दिष्ट करने के लिए हैं, यानी फ़ाइल की पहली पंक्ति (शीर्षलेख) और पहला कॉलम (आईडी) अनदेखा करें।

+0

धन्यवाद, मैं कोशिश करूँगा। –

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