Main Content

ValueStore

MATLAB クライアントとワーカーで共有されるデータ ストレージ

R2022a 以降

説明

ValueStore は、特定のジョブによって所有されるデータを格納するオブジェクトです。オブジェクトの各エントリは、値とそれに対応するキーで構成されます。所有するジョブが削除されると、ValueStore オブジェクトも削除されます。ValueStore を使用して、ジョブの実行中に MATLAB® クライアントによって取得できる、MATLAB ワーカーからのデータを格納します (ジョブがまだ実行中であっても)。

  • すべての MATLAB プロセス クライアントまたはワーカーは、いつでも ValueStore にエントリを書き込むことができます。すべての MATLAB プロセス クライアントまたはワーカーは、その後、このエントリをいつでも ValueStore から読み取ることができます。しかし、異なるプロセスによって実行される操作の順序は保証されません。

  • ValueStore はシステム メモリ内に保持されないため、大きな結果の保存に使用できます。

作成

以下を作成すると、ValueStore オブジェクトが自動的に作成されます。

  • parallel.Job オブジェクトである、クラスター上のジョブ。ジョブを作成するには、関数 batchcreateJob、または createCommunicatingJob を使用します。

  • ProcessPool オブジェクトである、ローカル マシン上のプロセス ワーカーの並列プール。プロセス プールを作成するには、関数 parpool を使用します。

  • ThreadPool オブジェクトである、ローカル マシン上のスレッド ワーカーの並列プール。スレッド プールを作成するには、関数 parpool を使用します。 (R2023b 以降)

  • ClusterPool オブジェクトである、マシンのクラスター上にあるワーカーの並列プール。クラスター プールを作成するには、関数 parpool を使用します。

関数 getCurrentValueStore を使用して、ワーカー上の ValueStore オブジェクトにアクセスできます。次に、ジョブまたは並列プールに関連付けられている ValueStore プロパティを使用して、クライアント上の ValueStore オブジェクトを取得できます。たとえば、バッチ ジョブの実行とワーカーからのデータの取得を参照してください。

プロパティ

すべて展開する

エントリの追加または置換に際して実行されるコールバック。関数ハンドルとして指定します。関数ハンドルは、エントリが追加または置換される際の ValueStore オブジェクトとそのキーを表す、2 つの入力引数を受け入れる必要があります。

エントリの削除に際して実行されるコールバック。関数ハンドルとして指定します。関数ハンドルは、エントリが削除される際の ValueStore オブジェクトとそのキーを表す、2 つの入力引数を受け入れる必要があります。

オブジェクト関数

isKeyValueStore オブジェクトまたは FileStore オブジェクトにキーが含まれているかどうかを判定する
keysValueStore オブジェクトまたは FileStore オブジェクトのすべてのキーを返す
putキーと値のペアを ValueStore オブジェクトに追加する
getValueStore オブジェクトからの値の取得
removeValueStore オブジェクトまたは FileStore オブジェクトからエントリを削除する

すべて折りたたむ

ワーカー上でシミュレーションを実行し、クライアント上でジョブのデータ ストレージを取得します。データ ストレージは、キーと値のエントリをもつ 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

独立タスクのジョブを実行します。次に、クライアント上でジョブのデータとファイル ストレージを取得します。

次のシミュレーションでは、ベクトルの順列と組み合わせを求め、結果を ValueStore オブジェクトと FileStore オブジェクトに保存します。

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 オブジェクトに格納されている 3 番目のタスクの結果を表示します。

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              

制限

  • 'HasSharedFileSystem'false に設定されている parallel.cluster.Generic クラスターを使用する場合、ジョブの実行中に ValueStore に対し加えられた変更の表示/非表示は、特定の実装によって異なります。MATLAB クライアントとワーカー JobStorageLocation 間での追加の同期がない場合、変更が表示されるのはジョブが完了してからになる可能性があります。

バージョン履歴

R2022a で導入

すべて展開する