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 von großen Daten beschleunigen

 

yarga09

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2016, 12:05     Titel: Einlesen von großen Daten beschleunigen
  Antworten mit Zitat      
Hallo alle zusammen,

ich möchte mehrere Datenmengen aus einem .dat file einlesen. Der Code funktioniert, jedoch ist die Dauer des Vorgangs viel zu lange.

Mein .dat file sieht so aus:

NUMBER = 4123
123.0 456.7 12.3
125.0 453.7 12.4
127.3 452.7 12.5
. . .
. . .
. . .
193.0 446.7 10.4

NUMBER = 2133
125.0 453.7 12.4
125.0 453.7 12.4
127.3 452.7 12.5
. . .
. . .
. . .
193.0 446.7 10.4


Es handelt sich hier um Koordinatenpunkte wo für jeden Abschnitt die Anzahl an Punkten unterschiedlich ist (Anzahl der Punkte bzw. Zeilen = NUMBER). Es sind in etwa 1000 solcher Abschnitte.

Mein Code:

Code:

j=2;
nb_data = 1000;

for i=1:nb_data

file=data.dat';
fid=fopen(file);
daten=textscan(fid,'%f %f %f','HeaderLines',j,'Delimiter',' ','MultipleDelimsAsOne',1);
fclose(fid);

format long
A = [daten{:}];
j = j + length(A) + 2;

end
 


Hat jemand eine Idee wie ich den Vorgang beschleunigen kann?

Vielen Dank und schöne Grüße


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 31.05.2016, 12:08     Titel:
  Antworten mit Zitat      
Mich interessiert zunächst der Applikationshintergrund. Wie lange ist lange und warum ist es zu lange? Werden die Daten immer wieder neu eingelesen, oder kann man sie einmal einlesen und als MAT files wieder schreiben.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
yarga09

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2016, 12:23     Titel:
  Antworten mit Zitat      
Der komplette Vorgang braucht etwa 11min für 1000 von solchen Abschnitten. Mein Ziel ist es etwa 10000 von denen.

Wie du siehst wird das Array A nach jedem Durchgang überschrieben.
Ich führe mit A in jedem Schleifendurchgang nur eine einfache Rechnung durch und speichere zwei Werte daraus.
D.h. ich brauche eine Datenmenge nur einmal einlesen und danach wird sie wieder gelöscht.
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 31.05.2016, 12:32     Titel:
  Antworten mit Zitat      
OK, also erstmal der Tipp:

Prä-allokation: A wird ja immer grösser. Das frisst sehr viel Zeit. Am Besten gleich am Anfang A so gross mit Nullen oder so vorbelegen und dann in jedem Schleifendurch lauf nur das neue Element überschreiben.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
yarga09

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.05.2016, 12:48     Titel:
  Antworten mit Zitat      
Das habe ich bereits getan mit der Funktion Zeros(), jedoch hatte das leider nur sehr geringe Verbesserung zu folge.
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 31.05.2016, 13:10     Titel:
  Antworten mit Zitat      
Es ist ein halbwegs aktuelles 64 Bit Release?

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
yarga09

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.06.2016, 07:49     Titel:
  Antworten mit Zitat      
Ja, ich benütze die Version R2014b_64b.

Glaubst du liegt es an meiner for-Schleife? Das dat.file hat etwa 3,5Mio Zeilen und ist 250MB groß. Sind 10min da als Dauer für den Einlesevorgang normal?

Danke.
 
Harald
Forum-Meister

Forum-Meister


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

das wiederholte Öffnen und Schließen der Datei wird viel Zeit in Anspruch nehmen. Lasse doch die Datei offen und zähle die Headerlines nur vom letzten gelesenen Wert.

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.06.2016, 09:31     Titel:
  Antworten mit Zitat      
Ja das war das Problem. Ich brauche jetzt statt 660s nur mehr 4s für den ganzen Vorgang!

Ich weiß eure Hilfe sehr zu schätzen.

Vielen Dank!
 
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.