Main Content

FileStore

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

説明

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

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

  • FileStore を使用して、クラスターに共有ファイル システムがない場合にファイルを返し、あるいは共有ファイル システムの場所とは無関係のコードを実行することができます。

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

作成

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

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

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

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

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

プロパティ

すべて展開する

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

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

オブジェクト関数

isKeyValueStore オブジェクトまたは FileStore オブジェクトにキーが含まれているかどうかを判定する
keysValueStore オブジェクトまたは FileStore オブジェクトのすべてのキーを返す
copyFileToStoreローカル ファイル システムから FileStore オブジェクトにファイルをコピーする
copyFileFromStoreFileStore オブジェクトからローカル ファイル システムにファイルをコピーする
removeValueStore オブジェクトまたは FileStore オブジェクトからエントリを削除する

すべて折りたたむ

ワーカー上でシミュレーションを実行し、クライアント上でジョブのファイル ストレージを取得します。ファイル ストレージは、キーとファイルのエントリをもつ FileStore オブジェクトです。

次のシミュレーションでは、乱数行列の平均と標準偏差を求め、結果を FileStore オブジェクトに保存します。

type workerStatsCode
function workerStatsCode(models)
% Get the FileStore of the current job
store = getCurrentFileStore;
for i = 1:numel(models)
    % Compute the average and standard deviation of random matrices
    A = rand(models(i));
    M = mean(A);
    S = std(A);
    % Save simulation results in temporary files
    sourceTempFile = strcat(tempname("C:\myTempFolder"),".mat");
    save(sourceTempFile,"M","S");
    % Copy files to FileStore object as key-file pairs
    key = strcat("result_",num2str(i));
    copyFileToStore(store,sourceTempFile,key);
end
end

次のコールバック関数は、FileStore オブジェクトにファイルがコピーされる際に実行されます。

type fileNewEntry
function fileNewEntry(store,key)
   destination = strcat(key,".mat");
   fprintf("Result %s added. Copying to local file system: %s\n",key,destination);
   copyFileFromStore(store,key,destination);
end

既定のクラスター プロファイルを使用して、ワーカー上でバッチ ジョブを実行します。

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

ジョブの実行中に、クライアント上で FileStore オブジェクトを取得します。ジョブの進行状況を表示します。

store = job.FileStore;
store.KeyUpdatedFcn = @fileNewEntry;
wait(job);
Result result_1 added. Copying to local file system: result_1.mat
Result result_2 added. Copying to local file system: result_2.mat
Result result_3 added. Copying to local file system: result_3.mat
Result result_4 added. Copying to local file system: result_4.mat

ファイル "result_3.mat" に保存されている変数に関する情報をすべて表示します。

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

  M         1x32              256  double              
  S         1x32              256  double              

プロセス ワーカーの並列プール上でシミュレーションを実行し、クライアント上のファイル ストレージを取得します。

次のシミュレーションでは、乱数行列の平均と標準偏差を求め、結果を FileStore オブジェクトに保存します。

type workerStatsCode
function workerStatsCode(models)
% Get the FileStore of the current job
store = getCurrentFileStore;
for i = 1:numel(models)
    % Compute the average and standard deviation of random matrices
    A = rand(models(i));
    M = mean(A);
    S = std(A);
    % Save simulation results in temporary files
    sourceTempFile = strcat(tempname("C:\myTempFolder"),".mat");
    save(sourceTempFile,"M","S");
    % Copy files to FileStore object as key-file pairs
    key = strcat("result_",num2str(i));
    copyFileToStore(store,sourceTempFile,key);
end
end

次のコールバック関数は、FileStore オブジェクトにファイルがコピーされる際に実行されます。

type fileNewEntry
function fileNewEntry(store,key)
   destination = strcat(key,".mat");
   fprintf("Result %s added. Copying to local file system: %s\n",key,destination);
   copyFileFromStore(store,key,destination);
end

プロセス ワーカーの並列プールを起動します。

pool = parpool("local");
Starting parallel pool (parpool) using the 'local' profile ...
Connected to the parallel pool (number of workers: 6).

このプールの FileStore を取得し、エントリの追加に際して実行されるコールバック関数を割り当てます。

store = pool.FileStore;
store.KeyUpdatedFcn = @fileNewEntry;

プール上でシミュレーションを実行します。

models = [4,8,32,20];
future = parfeval(@workerStatsCode,0,models);
wait(future);
Result result_1 added. Copying to local file system: result_1.mat
Result result_2 added. Copying to local file system: result_2.mat
Result result_3 added. Copying to local file system: result_3.mat
Result result_4 added. Copying to local file system: result_4.mat

ローカル ファイル result_3.mat に保存されている変数を表示します。

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

  M         1x32              256  double              
  S         1x32              256  double              

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

次のシミュレーションでは、ベクトルの順列と組み合わせを求め、結果を 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 クラスターを使用する場合、ジョブの実行中に FileStore に対し加えられた変更の表示/非表示は、特定の実装によって異なります。MATLAB クライアントとワーカー JobStorageLocation 間での追加の同期がない場合、変更が表示されるのはジョブが完了してからになる可能性があります。

バージョン履歴

R2022a で導入