MATLAB:如何尽快复制句柄对象

时间:2011-06-21 05:14:11

标签: matlab parallel-processing

我想知道如何在MATLAB中复制(也许删除)处理对象。

我目前正在使用MATLAB和一个名为CPLEX的附加组件编写大型方程组的求解器。此解算器主要涉及创建CPLEX句柄对象,然后使用求解方法解决它们,如下所示:

P = Cplex() %Create a Cplex object
%Code to specify the Cplex parameters
P.solve() %solve the Cplex object

在上面的代码中,P是属于Cplex()类的MATLAB句柄对象。它存储与其方程因子相关的矩阵结构。

我正在运行的主要问题是我必须多次“解决”相同的CPLEX对象,并且我想使用parfor循环并行执行此操作。不幸的是,MATLAB中的parfor循环需要透明性,因为多个线程不能在同一个对象上工作。

我已经考虑了几种方法:之前,我在parfor循环中创建并设置了Cplex()文件(事实证明这比单个线程实现慢);我也尝试将对象保存到磁盘并在parfor循环中加载它(再次太慢)。现在我想看看我是否可以复制对象(在parfor循环内或在其外部)。不幸的是,Cplex对象没有内置的“复制”功能,我必须自己编写类似的代码。

基本上我想做的事情归结为:

P = Cplex() %creates Cplex object
%Setup Cplex object

Q = cell(1,n) %create a container for Cplex objects

parfor 1:n

Q{i} = P.copy %create a copy of P and label it as Q{i}
Q{i}.solve()
Q{i} = [] %delete Cplex object (for memory purposes /preferable, but not necessary)

end

2 个答案:

答案 0 :(得分:1)

我没有CPLEX,因为我无法复制您的代码,请尝试以下建议并让我知道它是否有效(或者如果您收到错误,错误是什么)。

尝试将Q循环之外的parfor定义为

Q=arrayfun(@(x)P.copy,1:n,'UniformOutput',false);

这应该像以前一样创建一个单元格,你可以像Q{i}一样访问它,并且可以节省一些时间(因为如果你担心在处理后删除每个元素的内存问题,那么复制它也可能涉及一些时间开销。)

答案 1 :(得分:0)

我认为基本上有3种可能性,具体取决于CPLex的实施细节:

  1. 编写一个复制功能:如果CPlex的所有重要属性都是可公开写入的,这应该有效 - 这基本上是copyobj对于图形对象。
  2. 将CPlex子类化为MyCPlex并实现复制方法。只要没有任何重要属性private
  3. ,这应该有效
  4. 如果有私人财产,则要么必须将其更改为受保护并且使用解决方案否。 2或简单地将复制功能实现为CPlex中的方法。
  5. 鉴于构造函数的CPU耗时很高,2或3.可能是更好的版本,因为您可能必须实现一个空构造函数:一个只返回一个对象句柄而没有所有内部初始化的东西。 复制的实现细节应该是直截了当的 - 将copy-object的所有属性设置为原始对象的值: 在它的天真版本中:

    copyObj = CPlex();
    props = {'propA', 'propB', ...}; % list of a all non-dependent, non-constant properties
    for i=1:numel(props)
         copyObj.(props{i}) = originalObj.(props{i});
    end
    

    根据CPlex内部的复杂性,事情当然可能会更复杂......