6

同じコンピューター上の MATLAB プロセス間でメモリを共有する方法はありますか?

マルチコア コンピューター (必要に応じて Windows を実行) でいくつかの MATLAB プロセスを実行しています。それらはすべて同じ巨大な入力データを使用します。メモリ内にコピーを 1 つだけ持つと便利です。

編集: 残念ながら、各プロセスは巨大な入力データ全体にアクセスする必要があるため、データを分割して問題を解決する方法はありません。

4

4 に答える 4

5

私のMatlabファイル交換提出「sharedmatrix」#28572をチェックアウトすることをお勧めします。Unix のフレーバーを使用している場合、Matlab マトリックスを共有メモリに存在させることができます。次に、共有行列を parfor または spmd の本体に追加できます。つまり、

shmkey=12345;
sharedmatrix('clone',shmkey,X);
clear X;
spmd(8)
    X=sharedmatrix('attach',shmkey);
    % do something with X
    sharedmatrix('detach',shmkey,X);
end
sharedmatrix('free',shmkey);

X は spmd (または parfor) の本体の共有メモリに存在するため、読み込み時間も通信時間もありません。Matlab の観点からは、spmd (または parfor) 本体で新しく作成された変数です。

乾杯、

ジョシュ

http://www.mathworks.com/matlabcentral/fileexchange/28572-sharedmatrix

于 2010-08-27T19:24:21.570 に答える
4

編集:データを raw ファイルに入れて、memmapfileを使用します(SCFrench に感謝します)。

============================================

いいえ、それを行う実際の方法はありません。

私の上位 2 つの解決策は、RAM を購入するか、データのページ数を増やすことです。

最も近い方法は、mex 関数を使用して共有メモリを割り当ててから、mex 関数を連続して呼び出して、メモリの小さなスライスを抽出できるようにすることです。共有メモリを Matlab 配列としてラップしたくないでしょう (Matlab のメモリ モデルではうまく処理できないため)。

memmap を調べることを提案するつもりでしたが、明らかに問題があります。

場合によっては、最初に 1 つの Matlab プログラムを実行して、データを前処理または小さなチャンクに分割することができます。その後、各 Matlab プロセスは、独自の小さなチャンクで動作できます。

これは、Matlab で大規模なデータセットを処理するためのチュートリアルです。

于 2009-05-16T12:04:00.967 に答える
1

おそらくそうではありません。少なくとも、データを通常の MATLAB 変数のように扱う方法ではそうではありません。

Windows マシンの場合、COM/ActiveX ラッパーを作成して共有データにアクセスできます。MATLAB では、関数を介して COM オブジェクトを使用できますactxserver。しかし、さまざまなプロセスを通じて実際にデータに「直接」アクセスできるかどうかは疑問です。少なくともMATLAB と COM 間のデータ交換に関するMathworks ドキュメントによれば、MATLAB と COM の間に何らかのマーシャリング レイヤーがあり、データが変換されます。Windows マシンでプロセス間で高速アクセスを使用して構造化データを絶対に共有する必要がある場合はBoost::interprocessを介して共有メモリを使用するために C++ で何かを書くでしょう。インプロセス COM サーバー (DLL) でアクセスをラップします。私はかつてこれをやったことがあります。Boost::interprocess はそれをずっと簡単にしてくれますが、それは苦痛です。

Java のアプローチ (MATLAB は Java の上で実行されるため) ははるかに有望ですが、私の知る限り、共有メモリへのアクセスを提供する適切な Java ライブラリはありません。最も近いのは、おそらくjava.nio.MappedByteBufferを介してメモリ マップされたファイルを使用することですが、それは本当に低レベルです。それでも、データが比較的「正方形」の形式 (たとえば、均一なサイズのデータ​​の大きな 2 次元または 3 次元または 4 次元の行列) である場合、これは問題なく動作する可能性があります。

HDF5 ファイルを使用してみてください。MATLAB には組み込みのHDF5 サポートがあり、「比較的」高速です。しかし、私の経験からすると、HDF5 は並行性をうまく処理できないようです。(少なくとも、1 つのプロセスが書き込み中で、他のプロセスがリーダーである場合はそうではありません。複数のリーダーがあり、ライターが存在しない場合は、問題なく動作します。)

于 2009-05-18T13:41:36.173 に答える