如何在MATLAB中的进程之间共享内存?

Ann*_*naR 6 memory parallel-processing matlab process

有没有办法在同一台计算机上的MATLAB进程之间共享内存?

我在多核计算机上运行几个MATLAB进程(运行Windows,如果重要的话).它们都使用相同的巨大输入数据.在内存中只有一个副本就好了.

编辑:不幸的是,每个进程都需要访问整个巨大的输入数据,因此没有办法划分数据并解决问题.

gno*_*ice 6

如果进程只读取数据但不修改数据,那么我相信您可以将输入数据放入一个大文件中,并打开每个进程并从该文件中读取.每个进程都有自己的文件位置指示器,它可以移动到文件中的任何位置以读取所需的数据.我测试了两个MATLAB进程同时从文件中读取了一百万次左右,一切似乎都运行正常.我只使用了基本的文件I/O命令(如下所列).看来你也可以使用MEMMAPFILE来做这件事,正如Fooz先生在他的回答中提到的(和评论中的SCFrench),假设你有MATLAB版本R2008a或更新版本.

以下是您可能会使用的一些文件I/O命令:

该解决方案可能要求输入文件具有易于遍历的结构良好的格式(即仅一个大矩阵).如果它有很多可变长度字段,那么从文件中的正确位置读取数据可能会非常棘手.


如果进程还必须修改数据,这可能会变得更加困难.通常,您不希望文件/内存位置由多个进程同时写入,或者由另一个进程写入而另一个进程从同一位置读取,因为可能会导致不需要的行为.在这种情况下,您必须限制对文件的访问,以便一次只有一个进程在其上运行.其他过程必须等到第一个完成.在这种情况下,每个进程必须运行的代码示例版本是:

processDone = false;
while ~processDone,
  if file_is_free(),  % A function to check that other processes are not
                      %   accessing the file
    fid = fopen(fileName,'r+');  % Open the file
    perform_process(fid);        % The computation this process has to do
    fclose(fid);                 % Close the file
    processDone = true;
  end
end
Run Code Online (Sandbox Code Playgroud)

像这些(" ")这样的同步机制有时会产生很高的开销,从而降低了代码的整体并行效率.


jvd*_*lon 5

您可能想要查看我的Matlab文件交换提交"sharedmatrix"#28572.它允许Matlab矩阵存在于共享内存中,前提是您使用的是Unix的一些风格.然后可以将共享矩阵附加在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);
Run Code Online (Sandbox Code Playgroud)

由于X存在于spmd(或parfor)主体的共享内存中,因此它没有加载时间和通信时间.从Matlab的角度来看,它是spmd(或parfor)体中新创建的变量.

干杯,

玩笑

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