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?
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 ;)
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ß.
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.
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 ;)
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.
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.
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 ;)
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 ;)
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?
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 ;)
Einstellungen und Berechtigungen
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
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.