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

Probleme bei Datastore beim Einlesen von .dat

 

Phipsi
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.08.16
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 11.08.2016, 14:07     Titel: Probleme bei Datastore beim Einlesen von .dat
  Antworten mit Zitat      
Hallo zusammen,

wie im Titel erwähnt habe ich ein Problem mit dem Einlesen von einer großen Textdatei. (8589437 Zeilen und 12 Spalten, ca 1 GB groß).
Readtable oder textscan funktionieren bei dieser Größe nicht.
Also habe ich datastore und read benutzt, um das ganze Blockweise einzulesen.
Das ganze funktioniert auch gut, außer dass bei jedem siebten Block die readsize ignoriert wird und einfach irgendeine Anzahl von Zeilen eingelesen wird.

Hier ist mal das Programm bisher:
Code:

ds=datastore(ort,'Type','tabulartext'); %ort wird über uigetfile ausgewählt
 ds.ReadSize=43163;
    ds.ReadVariableNames=0;
count=0; %Zahl der Blöcke die eingelesen wurden
    rows=0; %Zahl der Zeilen die insgesamt eingelesen wurden
    s=zeros(230,1);  %Vektor mit der Anzahl der Zeilen die pro Block eingelesen wurden
    while hasdata(ds)
        data=read(ds);
        count=count+1;
        rows=rows+size(data,1);      
        s(count)=size(data,1);
    end
 


Die Kontrolvariablen am Ende der Schleife:
rows stimmt, es werden alle Zeilen eingelesen
count= 222, sind zu viele sollten eigentlich 199 sein.
Bei s sieht man, dass nur bei jedem siebten Block zu wenige Zeilen eingelesen werden. Aber auch da nicht immer gleich viele (schwankt so zwischen 10000 und 20000).

Weiß jemand, wie ich dafür sorgen kann, dass immer die gleiche Anzahl Zeilen gelesen werden?
Mein Arbeitsspeicher ist nicht ausgelastet. Da kann es also eigentlich nicht dran liegen.

Viele Grüße
Philipp

Edit: Nachdem ich mal einen durchlauf getimed habe, ist mir aufgefallen, dass die Funktion "TextFileSplitReader" 32 mal aufgerufen wird. Was auch die Anzahl der Blöcke mit weniger Zeilen ist (inkl. dem letztem, der nur noch auffüllt). Denke mal, da gibt es einen Zusammenhang.

Zuletzt bearbeitet von Phipsi am 11.08.2016, 14:35, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

aus der Doku:
Zitat:
If ReadSize is a positive integer, then each call to read reads at most ReadSize rows.

Das Verhalten ist also auf jeden Fall wie dokumentiert.

Warum hier weniger Zeilen als die Maximalzahl eingelesen werden, kann ich ohne die Datei auch nicht sagen. Gibt es denn irgendwelche Besonderheiten bei den Zeilen, an denen vorzeitig zum nächsten Block gesprungen wird?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.08.16
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 11.08.2016, 14:55     Titel:
  Antworten mit Zitat      
Schonmal danke für den Hinweis. Wo hast du das denn gefunden? In der Matlab-Hilfe zu Datastore bzw Read habe ich nämlich nichts gefunden (http://de.mathworks.com/help/matlab/ref/datastore.html).

Ich habe mir die entsprechenden Zeilen in der Datei mal angeschaut, kann aber nichts ungewöhnliches daran sehen.
Es sind wie immer das Datum und Uhrzeit (als ein String gespeichert), eine Spalte für fortlaufende Zählung und dann noch 10 Datenspalten (alle mit floats).
Keine fehlenden oder besonders große Werte in den Zeilen, die den Abbruch auslösen.

Edit:
Ich habe jetzt mal die ReadSize verändert und bei alter und neuer Size jeweils die Zeilen rausgeschrieben, wo es Probleme gibt und das sind in der Tat dieselbe. Also scheint es doch an der Datein zu liegen bzw. an diesen Zeilen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 11.08.2016, 20:10     Titel:
  Antworten mit Zitat      
Hallo,

hier:
http://de.mathworks.com/help/matlab.....datastore-properties.html

Zitat:
Ich habe jetzt mal die ReadSize verändert und bei alter und neuer Size jeweils die Zeilen rausgeschrieben, wo es Probleme gibt und das sind in der Tat dieselbe. Also scheint es doch an der Datein zu liegen bzw. an diesen Zeilen.

Kannst du dann mal einen kleinen Datensatz daraus zusammenbauen, anhanddessen man das Verhalten reproduzieren kann?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 11.08.16
Wohnort: München
Version: 2015b
     Beitrag Verfasst am: 02.09.2016, 10:48     Titel:
  Antworten mit Zitat      
Hallo,

ich weiß zwar bis heute nicht warum teilweise weniger eingelesen wird aber ich habe das ganze mit einer if-Abfrage umgangen.
Code:

while hasdata(ds)
        data=read(ds);
        %Kontrolle ob der ganze Tag eingelesen wurde
        if size(data,1)<ds.ReadSize
            readsize=ds.ReadSize; %Zwischenspeichern der eigentlichen ReadSize
            ds.ReadSize=ds.ReadSize-size(data,1); %Einlesen des fehlenden Teils des Tages
            data2=read(ds);
            data=[data; data2]; %Beide Teile des Tages zusammen fügen
            clear data2; %Löschen von Balast
            ds.ReadSize=readsize; %Wiederherstellen der ursprünglichen ReadSize
        end
%%Teil für egentliche Berechnung
end
 

Das ist zwar wahrscheinlich nicht die eleganteste Lösung aber funktioniert jetzt wie es soll.

Nochmal vielen Dank für deine Hilfe.
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.