在并行环境中保存到 matfile 时出现警告
Posted
技术标签:
【中文标题】在并行环境中保存到 matfile 时出现警告【英文标题】:Warning when saving to matfile in parallel environment 【发布时间】:2016-07-30 04:49:53 【问题描述】:我正在尝试处理一个时间信号,该信号被分成(许多)较小的段,并且每个段(“块”)都是独立分析的。这个输出,我想保存在一个组合文件中。
我目前的解决方案有效:
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
注意:process(data(:,i));
的输出与 config.chnk
预分配的类型相同。
现在,虽然这似乎有效(更新:它没有),但我收到了 Matlab 的警告:
警告:由于未知的 MAT 文件错误,无法读取某些变量。
在 matlab.io.MatFile/genericWho(第 209 行) 在 matlab.io.MatFile/whos(第 309 行) 在 matlab.io.MatFile 中(第 422 行) 在 matfile 中(第 75 行) 在 parallel_function>make_general_channel/channel_general (第 929 行) 在 remoteParallelFunction(第 38 行)
就我而言,我没有在parfor
中读取任何内容,因此我可以在创建文件对象时使用evalc
忽略脚本中的警告,但有人知道为什么会出现此警告,并且如何正确避免?
更新:实际上,它不起作用。我正在写入的确切变量无效,每当我尝试从中读取时,都会出现错误。
并行处理完成后,出现以下错误:
使用 matlab.io.MatFile/whos 时出错(第 311 行) 无法将 /Users/casparjespersen/ardetector/matlab/data/EMD/A0007_4/EEG.mat 作为有效的 MAT 文件打开。
matlab.io.MatFile 中的错误(第 422 行) varInfo = whos(obj);
matfile 中的错误(第 75 行) mf = matlab.io.MatFile(varargin:);
HHSA_BD_gen_emd 中的错误(第 104 行) parfor windowIdx = 1:size(windowChunks,2)
【问题讨论】:
如果所有写入线程都与文件相同,那么保存时它可能看起来像这样 确实如此。也许我应该将 parfor 操作的输出保存在内存中,然后在每 N 次迭代后,离开 parfor,保存,然后返回 parfor 循环进行剩余操作。 经过进一步考虑,将运行此程序的计算机有足够的内存一次分配所有块。我只是保存到内存中然后再归档,这整个问题是不必要的:-)但是谢谢。 【参考方案1】:正如@user3528438 指出的那样,这是由于工作人员同时写入文件。我选择重新设计我的脚本以避免在parfor
中编写。
【讨论】:
以上是关于在并行环境中保存到 matfile 时出现警告的主要内容,如果未能解决你的问题,请参考以下文章