Verfasst am: 28.11.2009, 04:08
Titel: geht es effizienter bzw schneller ???
Hallo Leute, habe ein Programm geschrieben das automatisch immer 11 zusammenhängende mat dateien einliest und anschliessen daraus eine matrize mit 11 Spalten bastelt und dieses Paket dann speichert! Im ordner den ich auswähle per uigetdir befinden sich 352 mat Dateien mit jeweils ca <1x168900 double> Werten.
Meine Frage ist nun, ob man das Programm effizienter schreiben kann bzw vektorisieren da es ca. 28 sek auf meinem Rechner braucht oder ist das normal ? (sind 57millionen daten, aber kommt mir trotzdem irgendwie zu lange vor???)
pat_dir = uigetdir; %Pat Verz. auswählen und anschließend hin wechseln
cd(pat_dir);
dir_str=dir('*.mat'); %alle mat dateien auslesen und in structur anlegen (hier in dir_str abgelegt)
file_names = {dir_str.name}; %Das Feld name von der Struktur (dir_str) an file_names übergeben....
index = int32(0); %speicher index
z = int32(1); %zähler für Kanäle und bei errecihen nach kanal 11 also 12 dann speicher bedingung!
ende = length(file_names);
%evtl auch verlegung möglich
for(i=1:(ende)) load(file_names{i}); %laden der jeweiligen datei namen
if(i==1) || (z==12) %bei ankommen an einem neuen 30 sek Block, d.h alle (1...1+11...23...etc..) Daten, erst eine leere Matrize der selben grösse anlegen!!!
n_zeilen = length(wavedata); %ermittle länge der Datei, erzeuge Matrize bzw(datenfeld) mit n_zeilen(ermittelt über datei länge) und 11 Spalten (10 Mic + 1 Flow)
daten = zeros(n_zeilen,11);
z = 1; % setze Zähler auf 1 zurück end
if(z < 3)
temp = calc_power (wavedata); %lasse die daten durch die Funkttion calc_power laufen und zwischenspeichere sie...
daten(:,z) = temp;
%daten(:,z) = calc_power (wavedata); %auch ohne zwiswchenspeicher möglich
end
if(z > 3)
%else
temp = calc_power (wavedata);
daten(:,z-1) = temp;
%daten(:,z-1) = calc_power (wavedata);
if(z==11) %block vorbei, da 11 kanäle durchgelaufen, --> speichern in einer mat datei, bsp 1.mat(diese beinhaltet 11 Kanäle der ersten 30 sek..... )! beinhaltet nur Matrize 'Daten'
index = index+1;
save(int2str(index),'daten');
end end
z=z+1;
waitbar(i/ende); %Ladebalken aktualisieren
end
zwei mögliche Gründe:
1. Wochenende -> weniger Aktivität hier
2. Die Fragestellung.
Bei gefühlten 50 geposteten Code-Zeilen ist es schwierig, einfach so einen Verbesserungsvorschlag zu bringen, wenn man die dahintersteckende Anwendung nicht kennt.
Vorschlag: verwende den Profiler, um zu sehen, welcher Teil des Codes langsam ist, und frag dann, wie man diesen Codeabschnitt verbessern kann.
Ich habe demnächst sowas ähnliches vor, vielleicht können wir uns da ja noch einmal etwas austauschen:
1. tic steht vor uigetfile, d.h. die Zeit, die der Benutzer braucht um etwas einzugeben wir mitgemessen.
2. Könnte ich mir vorstellen, dass der save Befehl noch zu weiterer Rechenzeit führen könnte. Warum soll in jedem Schleifendurchlauf auch wieder etwas gespeichert werden. Mann könnte doch ersteinmal alles einlesen (oder ist das zuviel für den Speicher). Danach könnte man alles Speichern.
Ich weiß nicht ob das viel hilft. Aber wir können ja mal darüber reden.
Viele Grüße,
der Oli
kingkamali
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.12.2009, 19:59
Titel:
also, wenn ich den save Befehl auskommentiere dann läuft das Programm mind 7X so schnell, nur es wird nix gespeichert!
Die Frage wäre wenn ich jetzt alles in einem speicher und es dann wieder später speichern will, kommt es doch auf das selbe hinaus oder nicht ?
ich denke es sollte etwas schneller sein, da ja jeder Speicherbefehl etwas mit Ramspeicher auf Festplattenspeicher zu tun hat. Wenn du jetzt alles unter daten abspeicherst also eine 3. Dimension dazupackst oder in ein Cellarray speicherst und nur diese Variable mit save speicherst geht es schneller.
Viele Grüße,
der Oli
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.