使用Big Matrix进行线性编程 - 仍然存在内存问题

时间:2015-03-03 21:02:08

标签: r memory-management matrix linear-programming

大家好,并提前致谢!我对这个问题进行了一次有趣的旅程。 Here我想出了如何使用bigmemory包创建一个文件支持的大矩阵。这个7062行乘364520列矩阵是线性规划问题中的约束矩阵我尝试使用Rsymphony包解决。代码如下,约束矩阵称为mat

Rsymph <- Rsymphony_solve_LP(obj
                             ,mat[1:nrow(mat),1:ncol(mat)]
                             ,dir
                             ,rhs
                             ,types="B",max=F, write_lp=T)

不幸的是,当我运行它时,Rsymphony尝试将文件支持的矩阵带入内存并且我没有足够的RAM。我甚至首先用bigmemory创建大矩阵的唯一原因是尽可能少地使用RAM。有什么方法可以使用这个代码或使用另一个线性编程功能完成这个与我可用的内存量?感谢。

1 个答案:

答案 0 :(得分:3)

这是我之前的担忧。运行mat[...]即可将big.matrix转换为常规matrix。该函数需要重写,以便与big.matrix个对象兼容。如果查看R_symphony_solve_LP的源代码,您会看到以下调用:

out <- .C("R_symphony_solve",
          as.integer(nc),
          as.integer(nr),
          as.integer(mat$matbeg),
          as.integer(mat$matind),
          as.double(mat$values),
          as.double(col_lb),
          as.double(col_ub),
          as.integer(int),
          if(max) as.double(-obj) else as.double(obj),
          obj2 = double(nc),
          as.character(paste(row_sense, collapse = "")),
          as.double(rhs),
          double(),
          objval = double(1L),
          solution = double(nc),
          status = integer(1L),
          verbosity = as.integer(verbosity),
          time_limit = as.integer(time_limit),
          node_limit = as.integer(node_limit),
          gap_limit = as.double(gap_limit),
          first_feasible = as.integer(first_feasible),
          write_lp = as.integer(write_lp),
          write_mps = as.integer(write_mps))

需要重写此C函数才能使其与big.matrix个对象兼容。如果使用此功能对您至关重要,则有一些示例说明如何使用RcppRcppArmadillo访问Rcpp Gallery网站上的big.matrix个对象。我很遗憾地说现在没有简单的解决办法。您需要获得更多RAM或开始编写更多代码。