我们正在尝试使用带有foreach的BigMemory库来平行我们的分析。但是,as.big.matrix函数似乎总是使用backingfile。我们的工作站有足够的内存,有没有办法在没有后备文件的情况下使用bigMemory?
此代码x.big.desc <-describe(as.big.matrix(x))
在将数据写入C:\ProgramData\boost_interprocess\
时非常慢。不知何故,它比直接保存x慢,是否具有较慢的I / O的as.big.matrix?
此代码x.big.desc <-describe(as.big.matrix(x, backingfile = ""))
非常快,但它也会将数据副本保存到%TMP%目录。我们认为它很快的原因,因为R启动了后台编写过程,而不是实际编写数据。 (我们可以在R提示符返回后看到TaskManager中的写入线程。)
有没有办法只将BigMemory与RAM一起使用,以便foreach循环中的每个worker都可以通过RAM访问数据?
感谢您的帮助。
答案 0 :(得分:0)
因此,如果你有足够的RAM,只需使用标准的R矩阵。要仅将每个矩阵的一部分传递给每个群集,请使用rdsfiles。
计算具有3个核心的colSums
的一个示例:
# 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()
。