Verfasst am: 29.04.2015, 09:31
Titel: Tipp zur Beschleunigung des Programmes
Hey Ho
Ich hab ein Programm welches eine Ordner-Struktur abfragt bis es Daten findet und dann diese Bearbeitet und in ein Array Schreibt anschließend in ein .txt .
Problem dabei ist das die Strucktur aus 45 Ordner mit je 9 Unterordnern gebildet wird und darin sind dann max 15 Datein
Das Programm Läuft aber Langsam, Bei der Berechnung finde ich es nicht so schlimm aber wenn die Ordner Leer sind braucht es auch ewig.
%% Leerzeilen finden ... [z, s] = size(A);
hlp = NaN(1, s);
log = false(z, 3); % pre-allocate for ii = 1:z
log(ii) = isequaln(A(ii,:), hlp);
end
idx = find(log);
% ... und entfernen
A(idx,:) = [];
[z,s] = size(A);
%% Zuschnitt
[M_PertGait_roh{iFile,1}, M_PertGait_roh{iFile,2}, M_PertGait_roh{iFile,3}, M_PertGait_roh{iFile,4}] = Zuschneiden_mit_Minimas( A );
M_PertGait_roh{iFile,4}(isnan([M_PertGait_roh{iFile,4}(:,1:20)]))=[];
end% daten einlesen in eine Tabelle
%% Berechnungen und Ausgaben for w =7:s % winkelspalten Nach TXT definieren
index=w-6; % um mit 1 zu starten for phase = 1:4% bei 3 schritten posterior
n=1000 for jFiles=1:numel(filesName)% Anzahl der Perturbationen
M_PertGait{phase}(:,jFiles)=interp1(1:length(M_PertGait_roh{jFiles,phase}(:,w)),M_PertGait_roh{jFiles,phase}(:,w),linspace(1,length(M_PertGait_roh{jFiles,phase}(:,w)),n(end)));
end
um ein programm "schneller " zu machen muss man erstmal rausfinden wo die zeit flöten geht um nicht unnötig irgendetwas zu optimieren was nix bringt. dafür sollte man erstmal den profiler benutzen.
grüße
p.s. warum clear all mist in einem programm ist wurde hier im forum schon sehr sehr oft besprochen.
_________________
Ja danke, der Läuft seit heute morgen =/
Das mit dem Clear all hab ich nur drinn weil ich soviel parallel mache und somit sicher bin das alle Parameter leer sind, aber ansich hb ich schon viel hier gelesen und seit den nutz ich es auch weniger =)
klicke doch mal auf SS_Datenmatrix, damit du siehst, welche Zeilen wirklich die meiste Zeit brauchen. Das ist ja die entscheidende Information.
Zitat:
Das mit dem Clear all hab ich nur drinn weil ich soviel parallel mache
Wenn du mehr mit Funktionen statt Endlosskripten arbeitest, wird sich der Bedarf für ein "clear all" (ein clear ist in der Regel vollkommen ausreichend) dramatisch reduzieren.
tja daraus geht ja hervor das die meiste zeit von der cell2csv2 verbraucht wird. diese funktion ist mir unbekannt. aber du solltest dann mal gucken wie diese funktion arbeitet. anscheinend werden dadrin ja num2str und int2str über 300k mal aufgerufen. vieleicht kann man da ansetzen.
_________________
ich sehe das anders: 1363s werden in SS_Datenmatrix verbracht, dagegen "nur" 385s in cell2csv2. Selbst wenn man cell2csv2 stark optimiert, wird das die Laufzeit der Anwendung also nicht spürbar verringern.
ja da hast du wahrscheinlich recht. asche auf mein haupt ich hatte da in meiner vorstellung was verwächselt ist immer nicht so leicht wenn man nicht selber rumclicken kann _________________
gibt es für cell2csv eine bessere alternative?
ich hab eine Datenmatrix in der 40spalten und 2500 zeilen zellen enthalten sind
in den letzten 36 sind je 1000 werte (zeile) enthalten die ich dann hintereinander in eine datenbank lesen möchte (ausgabe ambesten csv)
ich bin zugegebenermaßen verwirrt.
Gehören die verschiedenen Screenshots wirklich zu einem Profiler-Durchlauf?
Um zu sagen, ob man cell2csv(2) besser machen kann, müsste man zunächst wissen, was es ist und macht.
300000 Aufrufe von num2str dürften aber in den seltensten Fällen nötig sein.
Für einen einfachen Import/Export von tabellarischen Daten darf ich zudem Tables (u.a. readtable/writetable) empfehlen.
So von knapp 20min auf knapp 10min runtergehandelt
noch jemand eine iIee zum schreiben der daten?
oder kann ich bei 4x36000 werten nicht mehr erwarten?
vielleicht sollte ich 54x36000 wert draus machen somit muss ich die Funktion auch seltener aufrufen... *grübel*
%% Dateien einlesen ifnumel(filesName) < 9
Daten_Matrix(iFolder*6-5:iFolder*6,1:36000)=0; % wenn Ordner Leer oder weniger als 9 Files enthält dann schreibe 6 Zeilen mit 0 elseifnumel(filesName) >= 9% bei mehr als 9 berechne for iFile = 1:numel(filesName)
%% Leerzeilen finden ... [z, s] = size(A);
hlp = NaN(1, s);
log = false(z, 3); % pre-allocate for ii = 1:z
log(ii) = isequaln(A(ii,:), hlp);
end
idx = find(log);
% ... und entfernen
A(idx,:) = [];
[z,s] = size(A);
%% Zuschnitt
[M_PertGait_roh{iFile,1}, M_PertGait_roh{iFile,2}, M_PertGait_roh{iFile,3}, M_PertGait_roh{iFile,4}] = Zuschneiden_mit_Minimas( A );
M_PertGait_roh{iFile,4}(isnan([M_PertGait_roh{iFile,4}(:,1:20)]))=[];
end% daten einlesen in eine Tabelle
%% Berechnungen und Ausgaben for w =7:s % winkelspalten Nach TXT definieren
index=w-6; % um mit 1 zu starten for phase = 1:4% bei 3 schritten posterior
n=1000;
for jFiles=1:numel(filesName)% Anzahl der Perturbationen
M_PertGait{phase}(:,jFiles)=interp1(1:length(M_PertGait_roh{jFiles,phase}(:,w)),M_PertGait_roh{jFiles,phase}(:,w),linspace(1,length(M_PertGait_roh{jFiles,phase}(:,w)),n(end)));
end
das Schreiben der Datei mit csvwrite scheint die allermeiste Zeit zu benötigen. Um Alternativen benennen zu können, müsste man verstehen, was da eigentlich geschrieben wird.
Kannst du mal eine .mat-Datei mit Daten_Kopfzeile, Daten_Info_Spalten, Daten_Matrix zur Verfügung stellen?
Alternativ Datentyp und Dimensionen dieser Variablen.
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.