Линейное программирование с большой матрицей - все еще возникают проблемы с памятью

Всем привет и заранее спасибо! У меня было немного интересное путешествие с этой проблемой. Здесь я понял, как создать большую матрицу на основе файла, используя 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 пытается перенести матрицу с файловой поддержкой в ​​память, и у меня недостаточно ОЗУ. Единственная причина, почему я даже создал большую матрицу с bigmemory в первую очередь было использовать как можно меньше оперативной памяти. Можно ли как-нибудь с этим кодом или с помощью другой функции линейного программирования дополнить это объемом доступной памяти? Благодарю.

1 ответ

Решение

Это было моей заботой раньше. Запустив 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 объекты. Если использование этой функции критически важно для вас, есть несколько примеров того, как big.matrix объекты на сайте галереи Rcpp с использованием Rcpp и RcppArmadillo. Я сожалею, что сейчас нет простого решения. Вам нужно либо получить больше оперативной памяти, либо начать писать больше кода.

Другие вопросы по тегам