Ich würde gerne eine (ziemlich große) Protokolldatei in eine MATLAB-String-Zelle in einem Schritt einlesen. Ich habe das Übliche verwendet:
s={};
fid = fopen('test.txt');
tline = fgetl(fid);
while ischar(tline)
s=[s;tline];
tline = fgetl(fid);
end
aber das ist einfach langsam. Ich habe herausgefunden, dass
fid = fopen('test.txt');
x=fread(fid,'*char');
viel schneller ist, aber ich erhalte eine nx1
Zeichenmatrix, x
. Ich könnte versuchen, x
in eine Zeichen-Zelle umzuwandeln, aber dann gerate ich in die Zeichenkodierungshölle; der Zeilentrenner scheint \n\r oder 10 und 56 in ASCII zu sein (ich habe das Ende der ersten Zeile angesehen), aber diese beiden Zeichen folgen sich oft nicht und tauchen manchmal sogar einzeln auf.
Gibt es einen einfachen schnellen Weg, um eine ASCII-Datei in einer Zeichen-Zelle in einem Schritt zu lesen oder x
in eine Zeichen-Zelle zu konvertieren?
Lesen über fgetl:
Code Aufrufe Gesamtzeit % Zeit
tline = lower(fgetl(fid)); 903113 14.907 s 61.2%
Lesen über fread:
>> tic;for i=1:length(files), fid = open(files(i).name);x=fread(fid,'*char*1');fclose(fid); end; toc
Vergangene Zeit beträgt 0.208614 Sekunden.
Ich habe die Vorzuweisung getestet, und sie hilft nicht :(
files=dir('.');
tic
for i=1:length(files),
if files(i).isdir || isempty(strfind(files(i).name,'.log')), continue; end
%# weise s zu einer großen Zellenmatrix
sizS = 50000;
s=cell(sizS,1);
lineCt = 1;
fid = fopen(files(i).name);
tline = fgetl(fid);
while ischar(tline)
s{lineCt} = tline;
lineCt = lineCt + 1;
%# wachse s wenn notwendig
if lineCt > sizS
s = [s;cell(sizS,1)];
sizS = sizS + sizS;
end
tline = fgetl(fid);
end
%# entferne leere Einträge in s
s(lineCt:end) = [];
end
toc
Vergangene Zeit beträgt 12.741492 Sekunden.
Etwa 10 Mal schneller als das Original:
s = textscan(fid, '%s', 'Delimiter', '\n', 'whitespace', '', 'bufsize', files(i).bytes);
Ich musste 'whitespace'
auf ''
setzen, um die führenden Leerzeichen (die ich zum Parsen benötige) zu behalten, und 'bufsize' auf die Größe der Datei (der Standardwert 4000 führte zu einem Pufferüberlauffehler).
0 Stimmen
Nun ja, du gewinnst 2 Sekunden :). Wie auch immer, die Low-Level-Datei-Ein/Ausgabe-Funktionen in Matlab kommen mit einem erstaunlich großen Overhead. Ich habe das herausgefunden, als wir einen SSD-RAID demonstrierten und kaum eine Geschwindigkeitsverbesserung feststellten.