根据我的个人经验,我发现使用parfeval比内存使用更好.此外,您的问题似乎更易破碎,因此您可以使用parfeval向MATLAB工作人员提交更小的工作.

假设你有你将要处理jobCnt作业的workerCnt MATLAB工作人员.让数据是一个大小为jobCnt x 1的单元格数组,它的每个元素都对应于对数据进行分析的函数getOutput的数据输入.然后将结果存储在大小为jobCnt x 1的单元格数组输出中.

在下面的代码中,作业被分配在第一个for循环中,并且在第二个while循环中检索结果.布尔变量doneJobs指示哪个作业完成.

poolObj = parpool(workerCnt);

jobCnt = length(data); % number of jobs

output = cell(jobCnt,1);

for jobNo = 1:jobCnt

future(jobNo) = parfeval(poolObj,@getOutput,...

nargout('getOutput'),data{jobNo});

end

doneJobs = false(jobCnt,1);

while ~all(doneJobs)

[idx,result] = fetchnext(future);

output{idx} = result;

doneJobs(idx) = true;

end

此外,如果要节省更多内存,您可以进一步了解该方法.您可以做的是获取完成作业的结果后,可以删除未来的相应成员.原因是该对象存储getOutput函数的所有输入和输出数据,这可能是巨大的.但是你需要小心,因为删除未来成果的成员索引偏移.

以下是我为这个porpuse写的代码.

poolObj = parpool(workerCnt);

jobCnt = length(data); % number of jobs

output = cell(jobCnt,1);

for jobNo = 1:jobCnt

future(jobNo) = parfeval(poolObj,@getOutput,...

nargout('getOutput'),data{jobNo});

end

doneJobs = false(jobCnt,1);

while ~all(doneJobs)

[idx,result] = fetchnext(future);

furure(idx) = []; % remove the done future object

oldIdx = 0;

% find the index offset and correct index accordingly

while oldIdx ~= idx

doneJobsInIdxRange = sum(doneJobs((oldIdx + 1):idx));

oldIdx = idx

idx = idx + doneJobsInIdxRange;

end

output{idx} = result;

doneJobs(idx) = true;

end

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐