【问题标题】:Serialization error during parforparfor期间的序列化错误
【发布时间】:2015-09-01 15:21:15
【问题描述】:

我正在开展一个涉及样本 2D 投影的项目,我需要将其转换为横截面图像,然后堆叠每个横截面以获得 3D 图像。我使用 Matlab 进行模拟,但由于它涉及大量数据集,因此处理时间非常长。我希望显着减少。这是我的代码-

 projection_length = 1600;


 images = cell(1,500);


 for i = 1:500
    fname= sprintf('pre%03d.tif', i);
    images{i} = imread(fname);
 end

 parfor q = 1:projection_length
   tmpData = zeros(1600, 500); 
   for i = 1:500
     fname= sprintf('pre%03d.tif', i);
     tmpData(:, i) = images{i}(1 : 1600, q, :);

     disp(['Analyzing projection ' num2str(q)  ' of ' num2str(projection_length) ', Angle ' num2str(i) '...']);
   end
   idata=255-tmpData;   
   H = iradon(idata, 0.72, 'Hann', 0.8, 1600 ); 
   postfname= sprintf('post%06d.tif', q);
   imwrite(H, postfname);

 end

我在开始时将所有图像加载到一个单元格中,因为我发现当我在循环中一次又一次地读取特定区域时,imread 使用了大部分处理时间,但是由于图像很大并且图像变量也太大了在这种情况下很大,我的内存不足。对于大约 1600 的投影长度,我遇到了一个序列化错误,它说-

警告:在构建远程 parfor 代码期间发现错误。 parfor 构造现在将在本地运行,而不是 在远程 matlabpool 上。最可能的原因是 由于 a 无法发送输入参数 序列化错误。捕获的错误的错误报告是: 使用 distcompserialize 时出错 序列化期间内存不足

distcomp.remoteparfor 中的错误(第 36 行) obj.SerializedInitData = distcompMakeByteBufferHandle(distcompserialize(varargin));

parallel_function 中的错误(第 437 行) P = distcomp.remoteparfor(W, @make_channel, parfor_C);

Microfab_bead_reconstruction 中的错误(第 15 行) parfor q = 1:projection_length

在 450 处的并行函数中

有没有办法解决这个问题,是不是由于变量“图像”的巨大内存导致并行使用时的通信开销?还有其他选择吗?我尝试使用分布式变量类,但之后我将无法使用 parfor。

【问题讨论】:

    标签: matlab serialization parallel-processing parfor 3d-reconstruction


    【解决方案1】:

    您的代码的问题是,您使用的是broadcast variable image,这意味着变量被复制到每个工作人员。与其创建元胞数组,不如创建一个包含堆栈中所有图像的大型 4-D 矩阵。如果您现在在 parfor 循环中使用 tmp=images(:,:,q,:) 使用它,它返回 parfor 循环的一次迭代所需的所有数据,则只有 images 真正使用的部分被复制到每个工作人员。现在是正确的sliced variable。

    【讨论】:

    • 但是如果 4-D 矩阵太大会怎样?我认为矩阵应该在内存中是连续的,而单元阵列不是?所以这意味着对于一个单元格数组,你可以在这里有一些内存,一些在那里,但对于矩阵,它必须是连续的。那么如果矩阵很大会不会有错误呢? :(
    • 您可以对元胞数组进行切片,但通常使用矩阵可以获得更好的性能。但重要的一点是,对变量进行切片,不要将完整数据复制到每个工作人员。
    猜你喜欢
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2019-03-22
    相关资源
    最近更新 更多