WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zeilenweise Abarbeitung, Data Import, Maximale Datei größe

 

FeLe
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 29.11.2011, 11:24     Titel: Zeilenweise Abarbeitung, Data Import, Maximale Datei größe
  Antworten mit Zitat      
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
 
start=false; % Start noch nicht erfolgt
 
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
 
    while dt<dF
       
        % 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
 


Mit kleinerer Datei funktioniert es prima bei größeren Dateien dauert es Ewigkeit dann kommt die Fehlermeldung:

Code:

??? Error using ==> textscan
Invalid file identifier.  Use fopen to generate a valid file identifier.
 


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!

tab1_freq_info.zip
 Beschreibung:
Tabelle (F)

Download
 Dateiname:  tab1_freq_info.zip
 Dateigröße:  44.18 KB
 Heruntergeladen:  251 mal
tab2_data_csv.txt
 Beschreibung:
aufgezeichneten Werte

Download
 Dateiname:  tab2_data_csv.txt
 Dateigröße:  370.42 KB
 Heruntergeladen:  345 mal
Private Nachricht senden Benutzer-Profile anzeigen


tompie
Forum-Guru

Forum-Guru


Beiträge: 260
Anmeldedatum: 19.09.07
Wohnort: München
Version: immer alles
     Beitrag Verfasst am: 29.11.2011, 13:12     Titel:
  Antworten mit Zitat      
Hallo,

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

Importing Large ASCII Data Sets

sucht.

Gruß tompie
Private Nachricht senden Benutzer-Profile anzeigen
 
FeLe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 29.11.2011, 13:33     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.11.2011, 14:56     Titel:
  Antworten mit Zitat      
Hallo,

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.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
FeLe
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 09.12.10
Wohnort: Frankfurt a.M.
Version: Matlab 2013a
     Beitrag Verfasst am: 29.11.2011, 15:27     Titel:
  Antworten mit Zitat      
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.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 29.11.2011, 17:55     Titel:
  Antworten mit Zitat      
Hallo FeLe,

Eine fehlende Pre-allocation erzeugt eine exponentiell steigende Laufzeit. Auch wenn der einzelne Befehl harmlos aussieht, bedeutet exponentielles Wachstum doch immer Horror:
Code:
counts(f-1,1)=k;

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:
Code:
fid=fopen(file2read1);
if fid == -1, error('Cannot open file: $s', file2read1); end
...
fclose(fid);
 

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.