2016-04-08 11 views
1

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)

+0

wenn alle Threads schreiben, um die Datei es zu der Zeit zu speichern, würde wahrscheinlich aussehen wie – user3528438

+0

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. –

+0

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. –

Antwort

1

Wie @ user3528438 wies darauf hin, das die Arbeiter in die Datei zur gleichen Zeit mit dem Schreiben fällig ist. Ich entschied mich, mein Skript neu zu entwerfen, um das Schreiben von innerhalb parfor zu vermeiden.