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

Einlesen großer Datenmengen

 

Hecki
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2012, 18:09     Titel: Einlesen großer Datenmengen
  Antworten mit Zitat      
Hallo zusammen!

Ich habe zwar aktuell einen lauffähigen Code für mein Problem, allerdings ist es mir daran gelegen eine möglichst kurze Rechenzeit zu erzielen.
Vielleicht hat ja hier jemand eine Idee, wie ich den Import meiner Daten noch beschleunigen kann.

Meine Daten (Koordinaten, verschiedene Messwerte) liegen als ASCII Tabstopp getrennt (.dat) vor. Meine Test-Datei (folgende können noch größer werden) ist 600MB groß.
Darin enthalten sind ca. 6,5Mio. Zeilen à 10 Spalten.
Diese werden in unregelmäßigen Abständen durch Zeilen mit Text unterbrochen. Dieser Text ist für mich allerdings überflüssig.

Mein erster Versuch sah wie folgt aus:
Code:

fid=fopen('test.dat');
data={};
while ~feof(fid)
    tline=fgetl(fid);
    if isletter(tline(1))==1; % zeilen mit Buchstaben werden ausgelassen
    else
    data=[data;textscan(tline, '%f %f %f %f %f %f %f %f %f %f', 'delimiter', '\t')];
    end
end
fclose all;
 

Allerdings überschreitet die Rechenzeit hier locker 5 Minuten, habe diesen Code daher nie zuende laufen lassen.

Da die Funktion importdata nur bis zur ersten auftretenden Zeile mit Text importiert, gehe ich aktuell wie folgt vor. Öffnen der Test-Datei und anlegen einer Temp-Datei. Überschreiben der Daten ausgenommen der Textzeilen und anschließend importieren der kompletten Temp-Datei.
Dauer aktuell ca. 3,5 Minuten.

Code:

fid=fopen('test.dat');
fidd=fopen('temp.dat','w');
while ~feof(fid);
tline=fgets(fid);
if isletter(tline(1))==1;
else
fwrite(fidd, tline);
end
end
fclose all;
data = importdata('temp.dat');
delete temp.dat;
 


Irgendwelche Ideen?
Vielen Dank im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2012, 18:59     Titel:
  Antworten mit Zitat      
Hallo Hecki,

wie schön, dass ich immer wieder die gleichen Zeilen nur leicht abwandeln brauche:
Code:
data = fileread('test.dat');
data = regexprep(data,'^\s*[A-Za-z].*$','','lineanchors','dotexceptnewline');
data = sscanf(data,'%f',[10,inf])';


Sollte bei ein paar GB Arbeitsspeicher auch mit sehr großen Dateien umgehen können.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Hecki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.11.2012, 19:55     Titel:
  Antworten mit Zitat      
Fantastisch! Genau sowas hab ich mir vorgestellt. Kurz und bündig.
Besten Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Hecki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.01.2013, 17:31     Titel:
  Antworten mit Zitat      
Meine anfängliche Euphorie hat heute ein jähes Ende genommen.
Ich habe inzwischen meine tatsächlich für die Anwendung gedachten Daten erhalten. Größe ca. 1,1GB (weiß nicht, ob das was zur Sache tut).
Ich habe den Code noch um ein " für das Löschen der Zeilen erweitert, ansonsten habe ich ihn exakt so übernommen, wie von Sirius geschrieben.
Code:
function [data] = get_data (pfad, filename, anzvars)

% Datei zunächst als einzelnen String einlesen
data = fileread(fullfile(pfad, filename));
% Löschen der überflüssigen Zeilen mit Text
data = regexprep(data,'^\s*[A-Za-z"].*$','','lineanchors','dotexceptnewline');
% String in Matrix aufsplitten
data = sscanf(data,'%f',[anzvars,inf])';
end


Nun habe ich bei meiner aktuellen Datei das Problem, dass alle Schritte ordnungsgemäß durchlaufen werden, jedoch nach dem letzten Schritt, dem Aufsplitten des strings auf die Matrix das Ergebnis "no data" lautet.
Gleiches zeigt mir übrigens auch das Matlab Import Wizard an "[no data]".

Irgendwo scheint die Datei einen Stolperstein zu enthalten, allerdings ist mir schleierhaft, wie dieser aussehen soll oder an welcher Stelle er liegen könnte. Im Grunde sollte der Dateiaufbau identisch zu meinen vorherigen Dateien sein, mit denen alles tadellos funktioniert hat.

Hat jemand einen Rat?
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.