如何在MATLAB中的进程之间共享内存?
有没有办法在同一台计算机上的MATLAB进程之间共享内存 我正在一台多核计算机上运行几个MATLAB进程(如果有必要,运行Windows)。它们都使用相同的巨大输入数据。如果内存中只有一个副本就好了如何在MATLAB中的进程之间共享内存?,matlab,memory,process,parallel-processing,Matlab,Memory,Process,Parallel Processing,有没有办法在同一台计算机上的MATLAB进程之间共享内存 我正在一台多核计算机上运行几个MATLAB进程(如果有必要,运行Windows)。它们都使用相同的巨大输入数据。如果内存中只有一个副本就好了 编辑:不幸的是,每个进程都需要访问整个庞大的输入数据,因此无法分割数据并解决问题。编辑:将数据放入原始文件中并使用(谢谢) ============================================ 不,没有真正的方法 我最喜欢的两个解决方案是:购买更多的RAM或数据中的页面 您可以做
编辑:不幸的是,每个进程都需要访问整个庞大的输入数据,因此无法分割数据并解决问题。编辑:将数据放入原始文件中并使用(谢谢) ============================================ 不,没有真正的方法 我最喜欢的两个解决方案是:购买更多的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)主体中新创建的变量
干杯
乔希
这不是我想要的答案——我希望得到一个“是的,这是可能的,这样做吧”