【问题标题】:Warning when saving to matfile in parallel environment在并行环境中保存到 matfile 时出现警告
【发布时间】: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 循环进行剩余操作。
  • 经过进一步考虑,将运行此程序的计算机有足够的内存一次分配所有块。我只是保存到内存中然后再归档,这整个问题是不必要的:-)但是谢谢。

标签: matlab parallel-processing parfor mat-file


【解决方案1】:

正如@user3528438 指出的那样,这是由于工作人员同时写入文件。我选择重新设计我的脚本以避免在parfor 中编写。

【讨论】:

    猜你喜欢
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    相关资源
    最近更新 更多