运行批处理作业并从工作进程访问文件
您可以使用 batch
卸载计算并在后台运行。如果您的代码需要访问文件,您可以使用其他选项,例如 'AttachedFiles'
或 'AdditionalPaths'
,来使数据可访问。您可以在计算过程中关闭或继续在 MATLAB 中工作,然后稍后恢复结果。
准备示例
使用支持函数 prepareSupportingFiles
将此示例所需的数据复制到当前工作文件夹。
prepareSupportingFiles;
您当前的工作文件夹现在包含 4 个文件:A.dat
、B1.dat
、B2.dat
和 B3.dat
。
运行批处理作业
使用 parcluster
创建一个集群对象。默认情况下,parcluster
使用您的默认集群配置文件。在 MATLAB 主页选项卡上的环境部分中的并行 > 选择默认集群中检查您的默认集群配置文件。
c = parcluster();
将您的代码放在函数内,并使用 batch
将其作为批处理作业提交。有关自定义函数的示例,请参阅支持函数 divideData
。指定预期的输出参量数量以及包含函数输入的单元格数组。
请注意,如果您使用批处理发送脚本文件,MATLAB 会将所有工作区变量传输到集群,即使您的脚本不使用它们。如果您的工作空间较大,则会对数据传输时间产生负面影响。最佳实践是将脚本转换为函数文件以避免这种通信开销。您只需在脚本开头添加一个函数行即可完成此操作。为了减少此示例中的开销,divideData
在此实时脚本之外的文件中定义。
如果您的代码使用并行池,请使用 'Pool'
名称-值对参量来创建具有您指定工作进程数量的并行池。batch
使用额外的工作进程来运行函数本身。
默认情况下,batch
将工作进程的初始工作文件夹更改为 MATLAB 客户端的当前文件夹。控制工作进程中的初始工作文件夹会很有用。例如,如果您的集群使用不同的文件系统,您可能需要控制它,因此路径不同,例如当您从 Windows 客户端计算机提交到 Linux 集群时。
为了保留工作进程的初始工作文件夹并使用其默认值,请将
'CurrentFolder'
设置为'.'
。要更改初始工作文件夹,请将
'CurrentFolder'
设置为您选择的文件夹。
此示例使用具有三个工作进程的并行池,并为初始工作文件夹选择一个临时位置。使用 batch
来卸载 divideData
中的计算。
job = batch(c,@divideData,1,{}, ... 'Pool',3, ... 'CurrentFolder',tempdir);
batch
在并行工作进程上运行 divideData
,因此您可以在进行计算时继续在 MATLAB 中工作。
如果您想阻止 MATLAB 直到作业完成,请在作业对象上使用 wait
函数。
wait(job);
要检索结果,请在作业对象上使用 fetchOutputs
。由于 divideData
依赖于工作进程无法找到的文件,因此 fetchOutputs
抛出错误。您可以通过在作业中 Task
对象的 Error
属性上使用 getReport
来访问错误信息。在这个例子中,代码依赖于工作进程无法找到的文件。
getReport(job.Tasks(1).Error)
ans = 'Error using divideData (line 4) Unable to read file 'B2.dat'. No such file or directory.'
从工作进程访问文件
默认情况下,batch
会自动分析您的代码并将所需的文件传输给工作进程。在某些情况下,您必须明确传输这些文件 - 例如,当您在运行时确定文件的名称时。
在这个例子中,divideData
访问支持文件 A.dat
,batch
自动检测并传输该文件。该函数也访问 B1.dat
,但它在运行时解析文件的名称,因此自动依赖性分析不会检测到它。
type divideData.m
function X = divideData() A = load("A.dat"); X = zeros(flip(size(A))); parfor i = 1:3 B = load("B" + i + ".dat"); X = X + A\B; end end
如果数据位于工作进程可以访问的位置,则可以使用名称-值对参量 'AdditionalPaths'
来指定位置。'AdditionalPaths
' 将此路径添加到工作进程的 MATLAB 搜索路径,并使数据对他们可见。
pathToData = pwd; job(2) = batch(c,@divideData,1,{}, ... 'Pool',3, ... 'CurrentFolder',tempdir, ... 'AdditionalPaths',pathToData); wait(job(2));
如果数据位于工作进程无法访问的位置,您可以使用 'AttachedFiles'
名称-值对参量将文件传输给工作进程。如果客户端和工作进程不共享相同的文件系统,或者您的集群在非共享模式下使用通用调度器接口,则需要传输文件。有关详细信息,请参阅使用通用调度器接口进行配置 (MATLAB Parallel Server)。
filenames = "B" + string(1:3) + ".dat"; job(3) = batch(c,@divideData,1,{}, ... 'Pool',3, ... 'CurrentFolder',tempdir, ... 'AttachedFiles',filenames);
查找现有作业
您可以在提交作业后关闭 MATLAB 并稍后检索结果。在关闭 MATLAB 之前,请记下作业 ID。
job3ID = job(3).ID
job3ID = 25
当您再次打开 MATLAB 时,您可以使用 findJob
函数找到该作业。
job(3) = findJob(c,'ID',job3ID);
wait(job(3));
或者,您可以使用作业 Monitor 来跟踪您的作业。您可以从 MATLAB 主页选项卡的环境部分中的并行 > 监控作业中打开它。
检索结果并清理数据
要检索批处理作业的结果,请使用 fetchOutputs
函数。fetchOutputs
返回一个单元格数组,其中包含使用 batch
运行的函数的输出。
X = fetchOutputs(job(3))
X = 1×1 cell array
{40×207 double}
当您检索到所有必需的输出并且不再需要该作业对象时,请删除它以清理其数据并避免不必要地消耗资源。
delete(job)
clear job