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

Daten schneller einlesen

 

kannstmasehn
Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 12.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2018, 13:12     Titel: Daten schneller einlesen
  Antworten mit Zitat      
Hallo,

ich muss mit Matlab Messwerte verarbeiten und dazu z.B. 110 .m-Dateien einlesen, die zwischen 0,5 und 15 MB groß sind. Das einlesen dauert recht lange und ich würde das gerne verbessern. Liegt das nun eventuell an meinem Code oder an sich an der Menge? Wo gibt es Punkte zum Verbessern?

Ich lese die Dateien über load ein.

Vielen Dank im Voraus.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.11.2018, 13:58     Titel:
  Antworten mit Zitat      
Hallo,

sind es .m oder .mat-Dateien? Wie lange ist "recht lange"?
Um zu sagen, ob es am Code liegt, müsste man den Code sehen.

Falls nicht alle Variablen aus einer .mat-Datei benötigt werden, kann man das Einlesen beschleunigen, indem man wirklich nur die benötigten Variablen (und selbst von diesen eventuell sogar nur einen Teil) einliest.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
kannstmasehn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 12.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.11.2018, 14:22     Titel:
  Antworten mit Zitat      
Hallo,

sorry, es sind .mat-Dateien. Ich habe die Dateien schon verkleinert und nur die benötigten Messwerte rausgeschmissen. Vorher war noch eine ganze Menge an Informationen vorhanden und somit 5-6 mal so groß.

Code:
clear all, clc
files = dir('*.mat') ;
[num,dummy]=size(files);


for i = 1:num
    filename= lower(files(k).name);
    load(filename)
   
    sz_time(i,:) = size(time_raw,2);
    sz_max = max(sz_time);
   
    k = k + 1;
end


k = 1;


for j = 1:num
        filename= lower(files(k).name);
        load(filename)
       
        sz_time = size(time_raw,2);
        nan_missing = sz_max - sz_time;
        N = NaN(1,nan_missing);
       
        time_new = [time_raw N];
        time(j,:) = time_new;
             
        p_nach_new = bsxfun(@minus, p_nach_raw, p_nach_raw(1));
        p_nach_new = [p_nach_new N];
        p_nach(j,:) = p_nach_new;

        p_vor_new = [p_vor_raw N];
        p_vor(j,:) = p_vor_new;

        k = k + 1;
end
 


Das ist der Code zum Auslesen der Werte aus den Dateien. Die Variablen mit "_raw" sind Rohdaten aus den schon verkleinerten Dateien.

Recht lange sind 90 Sekunden, wenn ich beispielsweise einen von zehn Plots plotte und die anderen auskommentiert habe. Kann auch sein, dass das völlig normal ist von der Zeit her.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.11.2018, 23:22     Titel:
  Antworten mit Zitat      
Hallo,

mir stellt sich da die Frage, ob du das doppelte Einlesen der Daten vermeiden kannst.

Mögliche Alternativen könnten sein:
a) die NaN nach Bedarf nachträglich einfügen
b) anhand der Dateigröße die Datei mit sz_max bestimmen

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
kannstmasehn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 12.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2018, 09:50     Titel:
  Antworten mit Zitat      
Hallo,

also das wäre an sich ja gut. Das erste Einlesen ist dafür da, um die Zeit bzw. im Endeffekt Länge eines Vektors aus jeder Datei auszulesen und dann die maximale Zeit aller Vektoren zu ermitteln, um die restlichen auf diese Länge zu füllen.

Die Zeit aus der Dateigröße auslesen stelle ich mir nicht ganz trivial vor oder?

Ich könnte natürlich alle Daten einlesen, dann das Maximum ermitteln und dann die Vektoren auffüllen. Damit müsste ich die Dateien nur einmal Einlesen. Bei 400 Dateien sind das schonmal 5 Minuten, die Matlab da rechnet.
Private Nachricht senden Benutzer-Profile anzeigen
 
kannstmasehn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 12.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2018, 10:18     Titel:
  Antworten mit Zitat      
Ich habe nun aber beim Einlesen die Problematik, dass die Vektoren unterschiedlich lang sind, damit kann ich keine neue Matrix schreiben. Habe versucht das mit cell zu lösen, will er aber auch nicht. Wie kann ich das umsetzen? Danke im Voraus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

da ich keine Daten habe, ist es schwierig, das zu sagen.

Zitat:
Die Zeit aus der Dateigröße auslesen stelle ich mir nicht ganz trivial vor oder?

Das kommt drauf an. Wenn die Abtastung und der Startzeitpunkt immer gleich ist, sollte das gehen, indem man das Feld bytes von files verwendet. Ansonsten nicht.

Zitat:
Ich habe nun aber beim Einlesen die Problematik, dass die Vektoren unterschiedlich lang sind, damit kann ich keine neue Matrix schreiben. Habe versucht das mit cell zu lösen, will er aber auch nicht. Wie kann ich das umsetzen

In irgendeiner Form mit NaN auffüllen, wie bisher. Nur dass du nicht gleich auf die volle Länge auffüllst, sondern immer nur auf die größere Länge von dem, was du bisher eingelesen hast, und dem, was neu dazu kommt.

Wenn du drei kleine .mat-Dateien anhängen kannst, die repräsentativ für die Sammlung sind, kann es das leichter machen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
kannstmasehn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 12.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2018, 11:32     Titel:
  Antworten mit Zitat      
Danke dir. Ich habe mal drei "kleinere" Dateien angehängt mit den Daten.

3.mat
 Beschreibung:

Download
 Dateiname:  3.mat
 Dateigröße:  16.43 MB
 Heruntergeladen:  464 mal
2.mat
 Beschreibung:

Download
 Dateiname:  2.mat
 Dateigröße:  9.8 MB
 Heruntergeladen:  422 mal
1.mat
 Beschreibung:

Download
 Dateiname:  1.mat
 Dateigröße:  8 MB
 Heruntergeladen:  482 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

wenn ich es richtig sehe, brauchst du im ersten Durchlauf nicht alle Dateien einladen, sondern nur eine - und von der auch nur time_raw.

Angepasster Code mit z.B. auch noch Vorbelegung von Variablen:

Code:
tic
clear
clc
files = dir('*.mat') ;
[num,dummy]=size(files);
[~, fileNeeded] = max([files.bytes]);
filename= lower(files(fileNeeded).name);
load(filename, 'time_raw')
sz_max = size(time_raw, 2);


k = 1;

time = nan(num, sz_max);
p_nach = nan(num, sz_max);
p_vor = nan(num, sz_max);

for j = 1:num
        filename= lower(files(k).name);
        load(filename)
       
        sz_time = size(time_raw,2);
        nan_missing = sz_max - sz_time;
        N = NaN(1,nan_missing);
       
        %time_new = [time_raw N];
        time(j,1:numel(time_raw)) = time_raw;
             
        p_nach_new = bsxfun(@minus, p_nach_raw, p_nach_raw(1));
        %p_nach_new = [p_nach_new N];
        p_nach(j,1:numel(p_nach_new)) = p_nach_new;

        %p_vor_new = [p_vor_raw N];
        p_vor(j,1:numel(p_vor_raw)) = p_vor_raw;

        k = k + 1;
end
toc


Du solltest nachvollziehen, ob dieser Code auch noch das macht, was er soll.

Warum führst du eigentlich k ein? Du kannst doch auch j als Index nutzen?

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
kannstmasehn
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 34
Anmeldedatum: 12.07.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2018, 15:12     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank dafür. Ich habe das eingebaut und die Ergebnisse sind identisch mit den vorherigen, die Zeit beträgt nun bei 300 Dateien rund 250s (inkl. Plotten), das sind rund 60% weniger als vorher. Das ist sehr gut.

Zum Verständnis des Codes: Es wird die größte Datei ausgewählt und danach die Länge des längsten Vektors festgelegt und dann alle benötigten Vektoren erstmal mit nan auf der vorher bestimmten Länge gefüllt, so dass sie danach nur noch mit den Messwerten beschrieben werden und der Rest bleibt einfach stehen. So habe ich das verstanden. Kannst du da zustimmen? Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 09.11.2018, 15:31     Titel:
  Antworten mit Zitat      
Hallo,

genau.

Lass mal den Profiler drüber laufen. Ich würde vermuten, dass der allergrößte Teil der Zeit nun beim zweiten load-Befehl verbracht wird. Das lässt sich nicht verhindern.

Achte auch mal auf die Speicherauslastung. In dem Beispiel sind das schon über 200 MB, die im Speicher liegen. Wenn du viele solcher Dateien hast, wird der Hauptspeicher knapp.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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 - 2024 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.