Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中的进程之间共享内存?_Matlab_Memory_Process_Parallel Processing - Fatal编程技术网

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

如何在MATLAB中的进程之间共享内存?,matlab,memory,process,parallel-processing,Matlab,Memory,Process,Parallel Processing,有没有办法在同一台计算机上的MATLAB进程之间共享内存 我正在一台多核计算机上运行几个MATLAB进程(如果有必要,运行Windows)。它们都使用相同的巨大输入数据。如果内存中只有一个副本就好了 编辑:不幸的是,每个进程都需要访问整个庞大的输入数据,因此无法分割数据并解决问题。编辑:将数据放入原始文件中并使用(谢谢) ============================================ 不,没有真正的方法 我最喜欢的两个解决方案是:购买更多的RAM或数据中的页面 您可以做

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

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


编辑:不幸的是,每个进程都需要访问整个庞大的输入数据,因此无法分割数据并解决问题。

编辑:将数据放入原始文件中并使用(谢谢)

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

不,没有真正的方法

我最喜欢的两个解决方案是:购买更多的RAM或数据中的页面

您可以做的最接近的事情是使用mex函数来分配共享内存,然后允许对mex函数的连续调用来提取较小的内存片。您不希望将共享内存包装为Matlab数组(因为Matlab的内存模型不能很好地处理它)

我本想建议查看memmap,但显然是这样

有时,您可以先运行一个Matlab程序来预处理数据或将数据分割成较小的数据块。然后,每个Matlab进程都可以在其自身较小的块上运行


这里有一个关于在Matlab中处理大型数据集的例子。

可能不是,至少不是像处理常规Matlab变量那样处理数据

如果是在Windows计算机上,则可以创建COM/ActiveX包装来访问共享数据。MATLAB允许通过函数使用COM对象。但是,您是否可以通过不同的过程“直接”访问数据,这一点值得怀疑。MATLAB和COM之间有某种封送层,数据可以转换,至少根据Mathworks上的文档是这样的。如果我绝对的<>强>在进程之间共享结构化数据,在Windows机器上,用快速访问,我可能会写C++中的东西,使用共享内存并在进程内的COM服务器(DLL)中对其进行访问。我以前做过一次。尽管Boost::interprocess让它变得简单多了,但这是一种痛苦

Java方法(因为MATLAB运行在Java之上)更有希望,但据我所知,没有任何像样的Java库提供对共享内存的访问。最接近的方法可能是使用内存映射文件via,但这实际上是低级的。不过,如果您的数据是相对“正方形”的形式(例如,大小均匀的数据的大二维、三维或四维矩阵),这可能还可以


你可以尝试使用HDF5文件,MATLAB有内置的,而且速度“相对”快。但根据我的经验,HDF5似乎不能很好地处理并发性。(至少当一个进程正在写入,而其他进程是读卡器时是这样。如果有多个读卡器而没有写卡器,它就可以正常工作。)

如果进程只读取数据,但不修改数据,然后,我相信您可以将输入数据放入一个大文件中,并打开每个进程并从该文件中读取。每个进程都有自己的文件位置指示器,可以将其移动到文件中的任何位置以读取所需的数据。我测试了让两个MATLAB进程同时从一个文件中读取100万次左右的数据,结果一切正常。我只使用了基本文件I/O命令(如下所列)。正如他的回答(以及评论中的SCFrench)所提到的,假设您使用的是MATLAB版本R2008a或更新版本,那么您也可以使用

以下是一些可能用于此目的的文件I/O命令:

  • :每个进程将调用FOPEN并返回一个它将在所有后续调用中使用的文件标识符。您可以以二进制或文本模式打开文件:

  • :在二进制模式下,FREAD将从文件中读取数据:

    A = fread(fid,20,'double');  % Reads 20 double-precision values
    
    A = fscanf(fid,'%d',4);  % Reads 4 integer values
    
    ftell(fid)
    ans =
         8    % The position indicator is 8 bytes from the file beginning
    
    fseek(fid,0,-1);  % Moves the position indicator to the file beginning
    
  • :在文本模式下,FSCANF将读取并格式化文件中的数据:

    A = fread(fid,20,'double');  % Reads 20 double-precision values
    
    A = fscanf(fid,'%d',4);  % Reads 4 integer values
    
    ftell(fid)
    ans =
         8    % The position indicator is 8 bytes from the file beginning
    
    fseek(fid,0,-1);  % Moves the position indicator to the file beginning
    
  • /:在文本模式下,这些将从文件中读取整行

  • :这将告诉您当前文件位置指示器(以字节为单位),从文件开头开始:

    A = fread(fid,20,'double');  % Reads 20 double-precision values
    
    A = fscanf(fid,'%d',4);  % Reads 4 integer values
    
    ftell(fid)
    ans =
         8    % The position indicator is 8 bytes from the file beginning
    
    fseek(fid,0,-1);  % Moves the position indicator to the file beginning
    
  • :这会将文件位置指示器设置为文件中所需的位置:

    A = fread(fid,20,'double');  % Reads 20 double-precision values
    
    A = fscanf(fid,'%d',4);  % Reads 4 integer values
    
    ftell(fid)
    ans =
         8    % The position indicator is 8 bytes from the file beginning
    
    fseek(fid,0,-1);  % Moves the position indicator to the file beginning
    
  • :每个进程都必须关闭对文件的访问(很容易忘记这样做):

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


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

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

像这些(“”)这样的同步机制有时会有很高的开销,从而降低代码的整体并行效率。

您可能需要检查我的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);
由于X存在于spmd(或parfor)主体的共享内存中,因此它没有加载时间和通信时间。从Matlab的角度来看,它是spmd(或parfor)主体中新创建的变量

干杯

乔希


这不是我想要的答案——我希望得到一个“是的,这是可能的,这样做吧”