R bigmemory всегда использовать резервный файл?

Мы пытаемся использовать библиотеку BigMemory с foreach для параллельного анализа. Однако функция as.big.matrix, похоже, всегда использует backingfile. На наших рабочих станциях достаточно памяти, есть ли способ использовать bigMemory без файла поддержки?

Этот код x.big.desc <-describe(as.big.matrix(x)) довольно медленно, так как записывает данные в C:\ProgramData\boost_interprocess\, Каким-то образом это медленнее, чем прямое сохранение x, это как.big.matrix, который имеет более медленный ввод / вывод?

Этот код x.big.desc <-describe(as.big.matrix(x, backingfile = "")) довольно быстро, однако, он также сохранит копию данных в каталог%TMP%. Мы думаем, что причина в том, что это быстро, потому что R запускает процесс фоновой записи, вместо фактической записи данных. (Мы видим поток записи в TaskManager после возврата приглашения R).

Есть ли способ использовать BigMemory только с ОЗУ, чтобы каждый работник в цикле foreach мог получить доступ к данным через ОЗУ?

Спасибо за помощь.

1 ответ

Итак, если у вас достаточно оперативной памяти, просто используйте стандартные матрицы R. Чтобы передать только часть каждой матрицы в каждый кластер, используйте rdsfiles.

Один пример вычисления colSums с 3 ядрами:

# Functions for splitting
CutBySize <- function(m, nb) {
  int <- m / nb

  upper <- round(1:nb * int)
  lower <- c(1, upper[-nb] + 1)
  size <- c(upper[1], diff(upper))

  cbind(lower, upper, size)
}
seq2 <- function(lims) seq(lims[1], lims[2])

# The matrix
bm <- matrix(1, 10e3, 1e3)
ncores <- 3
intervals <- CutBySize(ncol(bm), ncores)
# Save each part in a different file
tmpfile <- tempfile()
for (ic in seq_len(ncores)) {
  saveRDS(bm[, seq2(intervals[ic, ])], 
          paste0(tmpfile, ic, ".rds"))
}
# Parallel computation with reading one part at the beginning
cl <- parallel::makeCluster(ncores)
doParallel::registerDoParallel(cl)
library(foreach)
colsums <- foreach(ic = seq_len(ncores), .combine = 'c') %dopar% {
  bm.part <- readRDS(paste0(tmpfile, ic, ".rds"))
  colSums(bm.part)
}
parallel::stopCluster(cl)
# Checking results
all.equal(colsums, colSums(bm))

Вы могли бы даже использовать rm(bm); gc() после записи частей на диск.

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