Main Content

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

ValueStore

MATLAB 客户端和工作进程共享的数据存储

自 R2022a 起

说明

ValueStore 是存储特定作业所拥有的数据的对象。对象的每个条目由一个值及其对应的键组成。当所属作业被删除时,ValueStore 对象也会被删除。使用 ValueStore 存储来自 MATLAB® 工作进程的数据,这些数据可以在作业执行期间由 MATLAB 客户端检索(即使作业仍在运行)。

  • 任何 MATLAB 进程客户端或工作进程都可以随时将条目写入 ValueStore。任何 MATLAB 进程客户端或工作进程都可以随时从 ValueStore 读取此条目。然而,不同进程执行操作的顺序并不能保证。

  • ValueStore 不保存在系统内存中,因此可用于存储大量结果。

创建对象

当您创建以下内容时,会自动创建 ValueStore 对象:

  • 集群上的作业,它是一个 parallel.Job 对象。要创建作业,请使用 batchcreateJobcreateCommunicatingJob 函数。

  • 本地机器上的进程工作进程并行池,它是一个 ProcessPool 对象。要创建进程池,请使用 parpool 函数。

  • 本地机器上的并行线程工作进程池,它是一个 ThreadPool 对象。要创建线程池,请使用 parpool 函数。 (自 R2023b 起)

  • 机器集群上的并行工作进程池,它是一个 ClusterPool 对象。要创建集群池,请使用 parpool 函数。

您可以使用 getCurrentValueStore 函数访问工作进程上的 ValueStore 对象。然后,您可以使用与作业或并行池关联的 ValueStore 属性在客户端上检索 ValueStore 对象。例如,请参阅 运行批处理作业并从工作进程中检索数据

属性

全部展开

添加或替换条目时执行的回调,指定为函数句柄。当添加或替换条目时,函数句柄必须接受两个输入参量,分别代表 ValueStore 对象及其键。

当条目被删除时执行的回调,指定为函数句柄。当条目被删除时,函数句柄必须接受两个输入参量,它们代表 ValueStore 对象及其键。

对象函数

isKey确定 ValueStoreFileStore 对象是否包含键
keys返回 ValueStoreFileStore 对象的所有键
putValueStore 对象添加键值对
getValueStore 对象获取值
removeValueStoreFileStore 对象中删除条目

示例

全部折叠

对工作进程运行仿真并在客户端上检索作业的数据存储。数据存储是一个具有键值条目的 ValueStore 对象。

以下仿真查找随机矩阵的奇异值并将结果存储在 ValueStore 对象中。

type workerSvdCode
function workerSvdCode(models)
% Get the ValueStore of the current job
store = getCurrentValueStore;
for i = 1:numel(models)
    % Store simulation results in the ValueStore object
    pause(1)
    key = strcat("result_",num2str(i));
    store(key) = svd(rand(models(i)));
    store("progress") = i/numel(models);
end
end

当向 ValueStore 对象添加条目时,将执行以下回调函数。

type handleNewEntry
function handleNewEntry(store,key)
if strcmp(key,"progress")
    fprintf("Progress update: %.2f %%\n",store(key)*100);
else
    fprintf("Result %s added\n",key);
end
end

使用默认集群配置文件在工作进程上运行批处理作业。

models = [8,16,32,20];
c = parcluster;
job = batch(c,@workerSvdCode,0,{models});

在作业仍在运行时检索客户端上的 ValueStore 对象。显示作业的进度。

store = job.ValueStore;
store.KeyUpdatedFcn = @handleNewEntry;
wait(job);
Result result_1 added
Progress update: 25.00 %
Result result_2 added
Progress update: 50.00 %
Result result_3 added
Progress update: 75.00 %
Result result_4 added
Progress update: 100.00 %

从对象中获取键 "result_1" 指定的条目值。

val1 = store("result_1")
val1 =

    4.3318
    1.2988
    1.1040
    0.8813
    0.5711
    0.3991
    0.2092
    0.1048

在进程工作进程的并行池上运行仿真并检索客户端上的数据存储。

以下仿真寻找随机矩阵的逆并将结果存储在 ValueStore 对象中。

type workerInvCode
function workerInvCode(models)
% Get the ValueStore of the current job
store = getCurrentValueStore;
for i = 1:numel(models)
    % Store simulation results in the ValueStore object
    pause(1);
    key = strcat("result_",num2str(i));
    store(key) = inv(rand(models(i)));
end
end

当向 ValueStore 对象添加条目时,将执行以下回调函数。

type handleUpdatedEntry
function handleUpdatedEntry(store,key)
    fprintf("Result %s added\n",key);
end

启动一个并行进程工作进程。

pool = parpool('Processes');
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to parallel pool with 6 workers.

获取此池的 ValueStore 并分配在添加条目时执行的回调函数。

store = pool.ValueStore;
store.KeyUpdatedFcn = @handleUpdatedEntry;

在池上运行仿真。

models = [4,8,32,20];
future = parfeval(@workerInvCode,0,models);
wait(future);
Result result_1 added
Result result_2 added
Result result_3 added
Result result_4 added

运行一项独立任务的作业。然后,在客户端上检索该作业的数据和文件存储。

下面的仿真找到向量的排列和组合,并将结果存储在 ValueStoreFileStore 对象中。

type taskFunction
function taskFunction(dataset,keyname)
% Get the ValueStore and FileStore of the current job
valueStore = getCurrentValueStore;
fileStore = getCurrentFileStore;
% Run the simulation to find permutation and combination
[result,logFile] = runSimulation(dataset);
% Store results in ValueStore to release system memory
valueStore(keyname) = result;
% Copy file to FileStore to retrieve the file from non-shared file system
copyFileToStore(fileStore,logFile,keyname);
end

function [result,logFile] = runSimulation(dataset)
    permutations = perms(dataset{1});
    combinations = nchoosek(dataset{1},dataset{2});
    result.N_perm = length(permutations);
    result.N_comb = length(combinations);
    logFile = strcat(tempname("C:\myLogFolder"),".mat");
    save(logFile,"permutations","combinations")
end

使用默认集群配置文件创建作业。

c = parcluster;
job = createJob(c);

为作业创建独立的任务。每个任务使用给定的输入运行仿真。

set_1 = {[12,34,54],2};
set_2 = {[45,33],1};
set_3 = {[12,12,12,13,14],3};
tasks = createTask(job,@taskFunction,0,{{set_1,"sim_1"},{set_2,"sim_2"},{set_3,"sim_3"}});

运行该作业并等待其完成。

submit(job);
wait(job);

检索作业的数据和文件存储。

valueStore = job.ValueStore;
fileStore = job.FileStore;

显示存储在 ValueStore 对象中的第三个任务的结果。

result_3 = valueStore("sim_3")
result_3 = struct with fields:
    N_perm: 120
    N_comb: 10

将文件从相应键 "sim_1""sim_2" 指定的文件存储复制到本地文件 "analysis_1.mat""analysis_2.mat"

copyFileFromStore(fileStore,["sim_1" "sim_2"],["analysis_1.mat" "analysis_2.mat"]);

显示存储在本地文件中的变量的所有信息。

whos -file 'analysis_1.mat'
  Name              Size            Bytes  Class     Attributes

  combinations      3x2                48  double              
  permutations      6x3               144  double              
whos -file 'analysis_2.mat'
  Name              Size            Bytes  Class     Attributes

  combinations      2x1                16  double              
  permutations      2x2                32  double              

限制

  • 当使用 parallel.cluster.Generic 集群并将 'HasSharedFileSystem' 设置为 false 时,作业运行时对 ValueStore 所做修改的可见性取决于您的具体实现。如果 MATLAB 客户端和工作进程 JobStorageLocation 之间没有额外的同步,那么只有在作业完成后才能看到更改。

版本历史记录

在 R2022a 中推出

全部展开