将一个非常大的矩阵加载到求解器中时,如何避免同时拥有两个实例?

How can I avoid having two instances of a very large matrix at the same time when loading it into a solver?

我正在将 Cplex 和 Gurobi 用于一个 LP 程序,该程序的不等式约束矩阵 A 可以变得非常大——大约 5 到 10GB。当我想使用其中一个求解器时,我必须创建一个包含所有问题约束的单独结构。这意味着我的工作区中有矩阵 A,同时我的求解器结构中有矩阵 A。即使我尽快在我的工作区中清除它,仍然存在两者都存在并且我的 RAM 过载的时间。

我在问是否有一些聪明的方法可以将矩阵 A 传递到模型中,而无需同时存在。我现在唯一能想到的就是分小块交付它...

MATLAB 使用写时复制或惰性复制。这意味着,只要您不修改其中一个副本,矩阵的所有副本都共享相同的数据:

A = randn(10000);
B = A; % does not take up extra memory
myfunc(B);

function myfunc(matrix)
   C = matrix; % does not take up extra memory.

有关参考,请参见 Loren's blog and Undocumented Matlab 上的示例。