R bigmemory是否始终使用备份文件?

R bigmemory是否始终使用备份文件?,r,r-bigmemory,rparallel,R,R Bigmemory,Rparallel,我们正在尝试使用foreach的BigMemory库来并行我们的分析。但是,as.big.matrix函数似乎总是使用backingfile。我们的工作站有足够的内存,有没有办法在没有备份文件的情况下使用bigMemory 代码x.big.desc因此,如果您有足够的RAM,只需使用标准的R矩阵即可。要仅将每个矩阵的一部分传递给每个集群,请使用rdsfiles 计算具有3个核的列和的一个示例: # Functions for splitting CutBySize <- function(

我们正在尝试使用foreach的BigMemory库来并行我们的分析。但是,as.big.matrix函数似乎总是使用backingfile。我们的工作站有足够的内存,有没有办法在没有备份文件的情况下使用bigMemory


代码x.big.desc因此,如果您有足够的RAM,只需使用标准的R矩阵即可。要仅将每个矩阵的一部分传递给每个集群,请使用rdsfiles

计算具有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))

你甚至可以使用rmbm;gc将部分写入磁盘后。

从vignette中可以看出,似乎不需要文件备份:数据结构可以分配给共享内存,允许同一台计算机上的不同进程共享对数据集单个副本的访问。数据结构也可以是fille-backed,使用户可以轻松地管理和分析大于可用RAM的数据集,并在集群的节点之间共享这些数据集。您可以通过指定shared=FALSE在RAM中使用big.matrix。但是,它不会在进程之间共享,因此您应该使用标准矩阵,将其复制到每个集群。存储在磁盘上的数据有什么问题?lmo:虽然文件说备份文件不是必需的,但实际上它总是使用它。Prive:Shared=FALSE时,我们不能使用foreach并行处理,工作人员将无法访问数据。使用磁盘很慢,我们的数据很大,但是我们有很大的RAM,如果我们只能使用RAM,我们会尽量避免从磁盘加载数据。如果你有足够的内存,为什么不使用标准的R矩阵呢?@F.Privé我们想用foreach来并行分析,但是将位矩阵传递给每个工作进程非常慢,所以我们想使用bigMemory,因此,每项工作只复制它需要的列。此外,我们有足够的内存来存储数据,但如果我们有20个工作,并且每个工作人员获得一份数据副本,则内存不足。谢谢回复。Prive,这正是我们目前的方法。如果我们可以使用BigMemory来保存数据,让每个工作人员复制所需的数据块,而不是写/读RDS文件,那就更好了。如果BigMemory可以用作共享内存,foreach works可以从中复制数据,这将非常有用。谢谢