我正在研究涉及样本的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的parallel_function中
有没有办法解决这个问题,是否由于变量'images'的巨大内存导致并行使用时的通信开销?还有其他选择吗?我尝试使用分布式变量类,但后来我无法使用parfor。
答案 0 :(得分:0)
您的代码的问题是,您正在使用broadcast variable TextBox
,这意味着该变量被复制到每个工作者。而不是创建单元格数组,创建一个包含堆栈中所有图像的大型4-D matrx。如果您现在在parfor循环中使用image
使用它,它返回parfor循环需要的所有数据,只有真正使用的部分tmp=images(:,:,q,:)
被复制到每个worker。它现在是正确sliced variable。