0

我正在阅读一个大文件,一次一行。为了加快速度,我想做的是并行处理多条生产线。但是我现在这样做的方式行不通。我从未尝试过,所以我不确定它是如何工作的。

测试数据.csv

library(foreach)
library(doParallel) #or with doMC



read.block <- function(ifile, lines, block, readFunc=read.csv,
                   skip=(lines*(block-1))+ifelse((header) & (block>1) & (!inherits(ifile, "connection")),1,0),
                   nrows=lines,header=TRUE,sep="\t",...){
  if(block > 1){
    colnms<-NULL
    if(header)
    {
      colnams <- unlist(readFunc(ifile, nrows=1, header=FALSE, sep=sep, stringsAsFactors=FALSE))
      #print(colnams)
    }
    p = readFunc(ifile, skip = skip, nrows = nrows, header=FALSE, sep=sep,...)
    if(! is.null(colnams))
    {
      colnames(p) = colnams
    }
  } else {
    p = readFunc(ifile, skip = skip, nrows = nrows, header=header, sep=sep)
  }
  return(p)
}

mendl.error <- matrix(, nrow=15, ncol=9)

foreach(i=1:15)%dopar%{
  ifile.c <- file("testdata.csv", open = "r") #open file connection to read
  ifile.valid <- read.block(ifile.c, lines=1, block=i) #read 1 line
  close(ifile.c) 
#do some other operations on the line which will be saved into a matrix
  mendl.error[1,] <- ifile.valid
}
4

1 回答 1

2

你还没有具体说明“不起作用”是什么意思,但我会说它没有按预期加速(尽管我也不太清楚你正在尝试的语义去做)。

原因是您的代码不受计算限制,而是受 IO 限制。这意味着,它必须等待来自辅助存储的数据。该数据的总线不是并行的,因此您的所有数据读取请求都被串行化。您无法通过以您尝试的方式使用并行性来显着加快这一速度。

事实上,如果您一口气阅读并依靠 R 来做正确的事情,您的代码可能会加快速度。如果您在这里真的需要原始读取性能,您可能需要求助于内存映射文件。一个快速的谷歌搜索已经出现了实现这一点的R 包。bigmemory

于 2013-12-02T20:37:04.687 回答