2016-02-19 23 views
6

Ich schreibe ein Matlab-Programm, das etwa 500 Dateien liest. Jede Datei hat 20.000 Zeilen mit jeweils einer Nummer in jeder Zeile. Das Programm versucht mit diesen Zahlen eine Matrix von 20.000 * 500 aufzubauen. Die Nummern werden als Double gespeichert, also 8 Bytes pro Nummer. Also würde ich erwarten, dass dies 20.000 * 500 * 8 Bytes benötigt, was ungefähr 1E8 ist, d. H. 100 MB. Und dennoch erschöpft dieses Programm meinen 16GB Speicher. Während das Programm läuft, sehe ich, dass die Speicherbelegung stetig zunimmt, GB von GB. Ich benutze Matlab R2015b auf Ubuntu 14.04.Warum benutzt mein Matlab-Programm so viel Speicher?

Was passiert? Vielen Dank für Ihre Aufmerksamkeit.

Hier ist der vollständige Code

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

Eine Sache zu versuchen ist, löschen Sie die erste Instanz von 'rnaCounts'; es ist unbenutzt und sehr groß, obwohl das nicht das sein sollte, was die Erinnerung aufbläht. – drhagen

+0

Versuchen Sie auch 'str2double' anstatt' str2num'. Das ist nicht genau das war 'str2num'. 'help str2num' und' help str2double' – drhagen

+0

Sind Sie sicher, dass der Speicher von Matlab und nicht nur vom Dateisystem-Cache gehalten wird? z.B. Wenn Sie Matlab töten, wird sofort der gesamte Speicher gelöscht? – drhagen

Antwort

3

Wie die OP überprüft, die str2num Funktion in der Linux-Version von Matlab 2015b hat einen Speicherverlust. Diese Funktion ist sowieso nicht sehr nützlich, da sie Zeichenfolgen analysiert, die ganze Matrizen darstellen (1 2; 3 4) und nicht den typischen Anwendungsfall der Analyse einer einzelnen Zahl (1.234). Verwenden Sie str2double, wenn Sie einfache Zahlenanalyse durchführen; es ist schneller, auch wenn str2num nicht kaputt ist.

Es ist wahrscheinlich, dass die Verwendung einer anderen Version von Matlab das Problem auch umgehen würde, da diese Art von Speicherfehlern meiner Erfahrung nach normalerweise nicht von einer Version zur nächsten bestehen.

1

Oft sind High-Level-E/A-Funktionen wie dlmread oder textscan nützlich, um solche Textformate zu lesen. Verwenden Sie dlmread, wenn Sie nur numerische Daten, und textscan für komplexere Formate haben.

Die Probe von Ihnen angegebenen Daten sind:

A2LD1|87769 135.5735

Wie Sie nur die Zahl in der zweiten Spalte müssen und die Kennung in der ersten Spalte verwerfen, alle numerische Daten sind, und Sie können dlmread verwenden.

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

Die \t ist, um anzugeben, dass der Begrenzer (Spaltentrenn) ist ein Tab. Die zwei 1 s sollen einen Zeilenoffset und einen Spaltenoffset angeben, d.h. die erste Zeile (die Kopfzeile) und die erste Spalte (ID) der Datei ignorieren.

+0

Danke, ich werde das versuchen. –

Verwandte Themen