我用:
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 gridData
和genSpline
加上前缀:
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矩阵。