Ho il seguente problema di prestazioni relativo all'ingresso di file di testo di grandi dimensioni (linee ~ 500k) e dati successivi che analizzano.Rimuovere le righe ricorrenti dal file di testo con prestazioni migliorate
consideri un file di testo data.txt
avente la seguente struttura di esemplare con la peculiarità che i due righe di intestazione può riapparire da qualche parte nel file di testo:
Name Date Val1 val2
--- ------- ---- ----
BA 2013-09-07 123.123 1232.22
BA 2013-09-08 435.65756 2314.34
BA 2013-09-09 234.2342 21342.342
Il codice che ho scritto e che sta lavorando è la seguente :
%# Read in file using textscan, read all values as string
inFile = fopen('data.txt','r');
DATA = textscan(inFile, '%s %s %s %s');
fclose(inFile);
%# Remove the header lines everywhere in DATA:
%# Search indices of the first entry in first cell, i.e. 'Name', and remove
%# all lines corresponding to those indices
[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1)));
for i=1:length(DATA)
DATA{i}(iHeader)=[];
end
%# Repeat again, the first entry corresponds now to '---'
[iHeader,~] = find(strcmp(DATA{1},DATA{1}(1)));
for i=1:length(DATA)
DATA{i}(iHeader)=[];
end
%# Now convert the cells for column Val1 and Val2 in data.txt to doubles
%# since they have been read in as strings:
for i=3:4
[A] = cellfun(@str2double,DATA{i});
DATA{i} = A;
end
ho scelto di leggere in ogni cosa come una stringa in oder di essere in grado di rimuovere il rimuovere le righe di intestazione ovunque in DATA
.
Arrestare l'ora mi dice che la parte più lenta del codice è la conversione [A] = cellfun(@str2double,DATA{i})
sebbene sia già la scelta più veloce rispetto a str2num
. La seconda parte più lenta è textscan
.
La domanda è ora, c'è un modo più veloce per affrontare questo problema?
Per favore fatemi sapere se dovrei ulteriormente chiarire. E perdonami se c'è una soluzione molto ovvia che non ho visto, sto solo lavorando con Matlab da tre settimane.
Questo ha funzionato bene per i miei dati. Evitare l'uso della stringa per raddoppiare la conversione diminuisce il tempo di 60%! – Lukas