とParallel::Loops
組み合わせてWin32::OLE
Matlabの複数のインスタンスを作成する場合、使用する場合
my $ML = Win32::OLE->new('Matlab.Application') or die "Cannot start MATLAB"
各ループで、プログラムがクラッシュし、未処理の例外が表示されます。
my
beforeをドロップする$ML
と機能しますが、実行中のインスタンスは常に 1 つだけです。
とParallel::Loops
組み合わせてWin32::OLE
Matlabの複数のインスタンスを作成する場合、使用する場合
my $ML = Win32::OLE->new('Matlab.Application') or die "Cannot start MATLAB"
各ループで、プログラムがクラッシュし、未処理の例外が表示されます。
my
beforeをドロップする$ML
と機能しますが、実行中のインスタンスは常に 1 つだけです。
並列ループで複数の MATLAB COM サーバーを作成する利点が何であるかはわかりません。
デフォルトでは、サーバーは共有モードで作成されます。つまり、すべてのインスタンスで共有されます。MATLAB エンジンはシングルスレッドとしてユーザーに公開されるため、この場合、すべてのクライアント計算は並列ではなくシリアルで実行されます。
幸いなことに、専用モードで MATLAB COM サーバーを作成します。
Win32::OLE->new('Matlab.Application.single')
詳細については、このページを参照してください
PS: 私は Perl をほとんど知りません :)
Parallel::Loop は、Win32::OLE で動作しないことがテストされ、Matlab の複数のインスタンスを開始しますが、Parellel::Forkmanager は、Amro の「単一の」トリックとhttp://www.perlmonks.org/bare/のヒントを使用して動作します。 ?node_id=894058「CoInitialize が呼び出されていません」のエラー:
ループ使用前:
use Win32::OLE; # qw(EVENTS); #Win32::OLE(0.1709) error 0x800401f0: "CoInitialize has not been called"
Win32::OLE->Initialize();
ループ内で次を使用します。
my $ML = Win32::OLE->new('Matlab.Application.single') or die "Cannot start MATLAB";
$ML->{'Visible'}=0;
$ML->Execute('try;cd \''.$wkdir.'\';'.$executable.' '.$file.' '.$countfile.';catch;end;quit;');
OLE を使用する目的は、次のものを使用するだけではありません。
system('matlab -automation -wait -r "try;cd \''.$wkdir.'\';'.$executable.' '.$file.' '.$countfile.';catch;end;quit;');
Matlab ウィンドウを非表示にすることです。作業を実行してもらいたいだけですが、名誉を得ることができます。Perl を使用して、並列化された matlab parfor 効果を実現することで、並列ループの前に割り当てられたタスクを実行するために使用可能なすべての CPU をビジー状態に保ち、そのループの後に結果を収集/結合できます。
さらに実験を重ねると、Parallel::Loop のエラーとWin32::OLE(0.1709) error 0x800706be: "The remote procedure call failed or Free to wrong pool when using Parallel::ForkManager can be both avoided. http://www-01.ibm.com/support/docview.wss?uid=swg21261292およびhttp://search.cpan.org/~gsar/libwin32-0.191/OLE/lib/Win32/OLEからの提案による/TPJ.pod about Silence the warning. すべてのコードは並列ループ内に含める必要があり、これが動作するバージョンです。
require Win32::OLE;
import Win32::OLE;
Win32::OLE->Initialize();
no warnings qw(once);
$Win32::OLE::Warn = 0;
my $ML = Win32::OLE->new('Matlab.Application.single') or die "Cannot start MATLAB";
$ML->{'Visible'}=0;
$ML->Execute('try;cd \''.$wkdir.'\';'.$executable.' '.$file.' '.$countfile.';catch;end;quit;');