Hallo allerseits!
Ich biete wider um ihre Hilfe. Ich bin dabei eine größere Datei mit aufgezeichneten Werten zu untersuchen. Ich habe zuerst versucht die Datei komplett zu laden. Funktionier bei 1500000 Text-Zeilen nicht. Nach zwei Stunden Warterei musste ich das Programm abbrechen. Dann habe ich die Routine geschrieben um das zeilenweise abzuarbeiten:
Code:
% Es sind zwei Tabellen. In einer Tabelle (F) sind die Zeiten drin, wann die % neue Frequenz eingestellt war, in anderer sind, in der Zeit % aufgezeichneten, Werte drin. Die Funktion zählt die Abtastwerte bei jeder % Frequenz. F wird als .mat File importiert.
% open file with data
fid=fopen(file2read1);
k=0; % initialisation of k - index of count
for f=2:length(F)-1% Gehe von der Zeile zwei bis zur vorlätzten Zeile
dF=F(f+1)-F(f); % Berechne Zeitfenster für den Frequenzwert
dt=0; % initialisation of time difference between start and actual samples
% Wird nur einmal abgearbeitet ganz am Anfang if k==0 && start==false fgetl(fid); % skip header line
str=fgetl(fid); % load string with start samples % take first 16 charakters from string as time info
data=textscan(str,'%16s %*s44','delimiter',';');
datestr1 = data{1,1}; % take time string
k=1; % indicator for new freqenz
start=true; % indicator for file start end
% Wird mit jeder neuen Frequenz ein mal abgearbeitet if k==0 && start==true
datestr1 = datestr2;
k=1; % indicator for new freqenz end
str=fgetl(fid); % load next text string
data=textscan(str,'%16s %*s44','delimiter',';');
datestr2 = data{1,1};
dt=pass_t(datestr1, datestr2); % calculate time gap between taht times
k=k+1;
end
if k==0% if after first loop indicator stay 0 meens there is no data break end
counts(f-1,1)=k; % safe sample count for that particular frequncy
k=0; % go to the new freqency end
Ich biete um die Erklärung, was ich falsch mache, oder die Hinweise wie ich das richtig machen kann, oder weiß jemand einfach die Lösungsvorschlag. Zum Ausprobieren habe ich die abgespeckte Text-Datei eingefügt. Vielen Dank für ihre Hilfe!
man sollte die Daten blockweise einlesen, z.B. in Blöcken von je 10000 Zeilen oder so. Wie man das machen kann, findet sich in der Matlab-Hilfe, wenn man nach
Genau so habe ich die Routine geschrieben, dass die nur eine einzige Zeile der Textdatei läd und dann die nächste usw. Warum funktioniert es nicht??? Wenn ich die Größe auf ca. 6000 Zeilen reduziere funktioniert es aber.
Vorschlag Tompie: man sollte die Daten blockweise einlesen, z.B. in Blöcken von je 10000 Zeilen oder so. Antwort Fele: dass die nur eine einzige Zeile der Textdatei läd und dann die nächste usw.
Ich kann auf den ersten Blick auch nicht sagen, wie es zu der Fehlermeldung kommt, jedoch: zeilenweise ist nun definitiv nicht dasselbe wie blockweise.
Wie lange braucht das Programm denn mit 6000 Zeilen? Ich würde erwarten, dass das, wenn du 1,5 Mio. Zeilen jede für sich analysierst, seeeeehr lange dauern dürfte.
Für 6000 Werten braucht das Program ca. 1,6s. Es klappt auch bei 400000 nicht mehr. Ich überlege ob es nicht mit loop variable zu tun hat. Die wie ich weiss integer Zahl ist.
Eine fehlende Pre-allocation erzeugt eine exponentiell steigende Laufzeit. Auch wenn der einzelne Befehl harmlos aussieht, bedeutet exponentielles Wachstum doch immer Horror:
Also "counts" vorher z.B. per ZEROS pre-allocieren.
Wenn Du eine Datei mit FOPEN öffnest, musst Du unbedingt testen, ob dies erfolgreich gewesen ist. Zudem ist die Anzahl der gleichzeitig offenen Files begrenzt. Deshalb müssen die File unbedingt wieder geschlossen werden:
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.