【发布时间】: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