一次在1行上并行工作

时间:2013-12-02 20:15:16

标签: r foreach domc

我一次只读一行大文件。我想要加快一切的目的是并行处理多行。但我现在这样做的方式并不奏效。我从未尝试过这个,所以我不确定它是如何工作的。

testdata.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
}

1 个答案:

答案 0 :(得分:2)

你还没有说明什么是“不起作用”的意思但是我正在说它并没有像预期的那样加速(虽然我也不太清楚你的语义'试图这样做。)

原因是你的代码不是计算绑定的,它是IO绑定的。意思是,它必须等待来自二级存储的数据。该数据的总线不是并行的,因此所有数据读取请求都会被序列化。通过以您尝试的方式使用并行性,您无法显着提高速度。

事实上,如果你一次性完成阅读并依靠R来做正确的事情,你的代码可能会加速。如果你真的需要原始阅读性能,你可能需要求助于内存映射文件。一个快速的谷歌搜索出现了实现这一点的R package bigmemory