MATLAB:Parpool共享数据访问

时间:2015-01-21 21:00:11

标签: matlab parallel-processing interpolation parfor

我用:

if isempty(gcp('nocreate'))
  parpool([ 1, Inf ]);
end

...在我的包装函数wrapper.m中创建一个parpool,它在我的桌面上给了我4个工人。 wrapper.m调用文件foo.m,然后多次调用bar.m

包装器函数生成大量数据,这是bar.m纯粹只读的基础所必需的:

wrapper.m

  genSpline = griddedInterpolant({ gridData.xgv, gridData.ygv, gridData.zgv }, ...
              gridData.data, 'spline', 'spline');

bar.m

  val = genSpline(interPts);

当通过bar.m作为参数传递给foo.m时,池中的每个工作者都维护自己的genSpline私有副本,由于冗余数据导致大量内存泄漏。但是,该程序可以正常工作。

为了解决这个问题,我将def {and gridDatagenSpline加上前缀:

global gridData genSpline;

......正如文档似乎暗示的那样。但是,这失败了:

'Subscript indices must either be real positive integers or logicals.'

...在bar.m中。恢复通过参数传递证明interPts没有任何问题。使用全局变量对def进行打印并使用该版本可以得到:

wrapper.m

  genSpline = 
    griddedInterpolant with properties:
                GridVectors: {[1x41 double]  [1x41 double]  [1x12 double]}
                     Values: [41x41x12 double]
                     Method: 'spline'
        ExtrapolationMethod: 'spline'

bar.m

  genSpline =
       []

...暗示全局变量未正确设置,或由于某种原因而无法被bar.m访问。没有涉及分布式网络,并且所有文件都在同一目录中,该目录位于MATLAB(R2014a 64位UNIX)路径上。有什么建议吗?

PS:声明和使用全局变量的相同方法适用于常规' 2x2矩阵。

1 个答案:

答案 0 :(得分:1)

并行池中的MATLAB工作者是完全独立的进程,因此您只能通过将其声明为global来共享来自客户端的数据。您可以使用shared matrix来解决此问题。