Ich versuche ein Zeitsignal zu verarbeiten, das in (viele) kleinere Segmente aufgeteilt ist, und jedes Segment ("Chunk") wird unabhängig voneinander analysiert. Diese Ausgabe möchte ich in einer kombinierten Datei speichern.Warnung beim Speichern in Matfile in paralleler Umgebung
Meine aktuelle Lösung funktioniert:
configFileName = 'config.mat';
config = matfile(configFileName,'Writable',true);
% some irrelevant stuff saved in config
config.chnk(1,N) = struct('var1',[],'var2',[],'var3',[]); % pre-allocating
clearvars config;
parfor i = 1:N
config = matfile(configFileName,'Writable',true);
chunk = process(data(:,i)); % data has previously been sliced
config.chnk(1,i) = chunk;
end
Hinweis: Ausgabe von process(data(:,i));
ist von derselben Art, die config.chnk
wird vorab zugewiesene mit. , Jetzt, während dies scheint (Update: Es ist nicht der Fall ist) zu arbeiten, erhalte ich eine Warnung von Matlab:
Warning: Unable to read some of the variables due to unknown MAT-file error.
In matlab.io.MatFile/genericWho (line 209) In matlab.io.MatFile/whos (line 309) In matlab.io.MatFile (line 422) In matfile (line 75) In parallel_function>make_general_channel/channel_general (line 929) In remoteParallelFunction (line 38)
In meinem Fall, ich lese nicht alles innerhalb parfor
so konnte ich meine die Warnung auslassen nur in Skript mit evalc
beim Erstellen des Dateiobjekts, aber weiß jemand, warum diese Warnung angezeigt wird, und wie man es richtig vermeidet?
aktualisieren: Es funktioniert nicht, eigentlich. Die genaue Variable, in die ich schreibe, ist ungültig, und wenn ich versuche, von ihr zu lesen, erhalte ich einen Fehler.
Wenn der parallele Prozess beendet war, bekam ich folgende Fehlermeldung:
Error using matlab.io.MatFile/whos (line 311) Could not open /Users/casparjespersen/ardetector/matlab/data/EMD/A0007_4/EEG.mat as a valid MAT-file.
Error in matlab.io.MatFile (line 422) varInfo = whos(obj);
Error in matfile (line 75) mf = matlab.io.MatFile(varargin{:});
Error in HHSA_BD_gen_emd (line 104) parfor windowIdx = 1:size(windowChunks,2)
wenn alle Threads schreiben, um die Datei es zu der Zeit zu speichern, würde wahrscheinlich aussehen wie – user3528438
Sie tun. Vielleicht sollte ich die Ausgabe der Parfor-Operation in dem Speicher speichern und dann nach jeder N-ten Iteration Parfor verlassen, speichern und zu der Parfor-Schleife für die verbleibenden zurückkehren. –
Nach weiterem Nachdenken haben die Computer, auf denen diese ausgeführt werden, genug Speicher, um alle Chunks auf einmal zuzuordnen. Ich speichere nur im Speicher und feile danach, das ganze Problem ist nicht nötig :-) Aber danke. –