Main Content

本页采用了机器翻译。点击此处可查看最新英文版本。

运行批处理作业并从工作进程访问文件

您可以使用 batch 卸载计算并在后台运行。如果您的代码需要访问文件,您可以使用其他选项,例如 'AttachedFiles''AdditionalPaths',来使数据可访问。您可以在计算过程中关闭或继续在 MATLAB 中工作,然后稍后恢复结果。

准备示例

使用支持函数 prepareSupportingFiles 将此示例所需的数据复制到当前工作文件夹。

prepareSupportingFiles;

您当前的工作文件夹现在包含 4 个文件:A.datB1.datB2.datB3.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.datbatch 自动检测并传输该文件。该函数也访问 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

另请参阅

| | |