2

我有一个非常适合我的目的的代码(它读取一些具有特定模式的文件,读取每个文件中的矩阵并使用每个文件对计算一些东西......最终输出是一个与文件大小相同的矩阵号),看起来像这样:

m<- 100
output<- matrix(0, m, m)

lista<- list.files(pattern = "q")
listan<- as.matrix(lista)
n <- nrow(listan)

for (i in 1:n) {    
AA    <- read.table((listan[i,]), header = FALSE)
A<- as.matrix(AA)
dVarX <- sqrt(mean(A * A))

 for (j in i:n) {
    BB <- read.table ((listan[j,]), header = FALSE)
    B<- as.matrix(BB)
    V <- sqrt (dVarX * (sqrt(mean(B * B))))
    output[i,j] <- (sqrt(mean(A * B))) / V        
 }
}

我的问题是这需要很多时间(我有大约 5000 个矩阵,这意味着 5000x5000 个循环)。我想并行化,但我需要一些帮助!等待您的好意建议!

先感谢您!

瞎扯

4

1 回答 1

4

瓶颈可能是从磁盘读取。不能保证并行运行代码会使事情变得更快。在这种情况下,多个进程同时尝试从同一个磁盘读取可能比单个进程还要慢。

由于您的矩阵是由另一个 R 进程编写的,因此您确实应该将它们保存为 R 的二进制格式。您读取每个矩阵一次且仅一次,因此使程序更快的唯一方法是更快地从磁盘读取。

这是一个示例,向您展示了它的速度可能有多快:

# make some random data and write it to disk
set.seed(21)
for(i in 0:9) {
  m <- matrix(runif(700*700), 700, 700)
  f <- paste0("f",i)
  write(m, f, 700)              # text format
  saveRDS(m, paste0(f,".rds"))  # binary format
}

# initialize two output objects
m <- 10
o1 <- o2 <- matrix(NA, m, m)

# get list of file names
files <- list.files(pattern="^f[[:digit:]]+$")
n <- length(files)

首先,让我们使用 运行您的代码scan,这已经比您当前使用read.table.

system.time({
  for (i in 1:n) {    
    A <- scan(files[i],quiet=TRUE)

    for (j in i:n) {
      B <- scan(files[j],quiet=TRUE)
      o1[i,j] <- sqrt(mean(A*B)) / sqrt(sqrt(mean(A*A)) * sqrt(mean(B*B)))
    }
  }
})
#    user  system elapsed 
#   31.37    0.78   32.58

现在,让我们使用以 R 的二进制格式保存的文件重新运行该代码:

system.time({
  for (i in 1:n) {    
    fA <- paste0(files[i],".rds")
    A <- readRDS(fA)

    for (j in i:n) {
      fB <- paste0(files[j],".rds")
      B <- readRDS(fB)
      o2[i,j] <- sqrt(mean(A*B)) / sqrt(sqrt(mean(A*A)) * sqrt(mean(B*B)))
    }
  }
})
#    user  system elapsed 
#    2.42    0.39    2.92

所以二进制格式要快 10 倍!输出是一样的:

all.equal(o1,o2)
# [1] TRUE
于 2013-02-08T16:59:04.167 回答