matlab parfeval,matlab – 向工作人员发送数据
根据我的个人经验,我发现使用parfeval比内存使用更好.此外,您的问题似乎更易破碎,因此您可以使用parfeval向MATLAB工作人员提交更小的工作.假设你有你将要处理jobCnt作业的workerCnt MATLAB工作人员.让数据是一个大小为jobCnt x 1的单元格数组,它的每个元素都对应于对数据进行分析的函数getOutput的数据输入.然后将结果存储在大小为jobCnt x 1的
根据我的个人经验,我发现使用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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)