R 一次在一条线上并行工作

R 一次在一条线上并行工作,r,foreach,domc,R,Foreach,Domc,我在一个大文件中一次读一行。我想做的是加速每件事是在多条线上并行工作。但我现在的做法是行不通的。我从未尝试过这个,所以我不确定它是如何工作的 库(foreach) 库(双并行)#或与doMC read.block 1)和(!inherits(ifile,“connection”)、1,0), nrows=行,header=TRUE,sep=“\t”,…){ 如果(块>1){ colnms您还没有指定“不工作”的含义,但我冒险说它没有按照预期的速度加速(尽管我也不太清楚您试图做什么的语义) 这是

我在一个大文件中一次读一行。我想做的是加速每件事是在多条线上并行工作。但我现在的做法是行不通的。我从未尝试过这个,所以我不确定它是如何工作的

库(foreach)
库(双并行)#或与doMC
read.block 1)和(!inherits(ifile,“connection”)、1,0),
nrows=行,header=TRUE,sep=“\t”,…){
如果(块>1){

colnms您还没有指定“不工作”的含义,但我冒险说它没有按照预期的速度加速(尽管我也不太清楚您试图做什么的语义)

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


事实上,如果你一次读取代码并依靠R做正确的事情,你的代码可能会加快。如果你真的需要原始的读取性能,你可能需要使用内存映射文件。快速的谷歌搜索已经找到了实现这一点的方法。

是速度问题吗?。因为我可以想出许多其他更简单的方法(而且可能更有可能奏效)加快速度的方法…是的。但请记住,这只是一个大型脚本的摘录。这读起来像C代码…这不是一件好事,因为R根本不像C。值得注意的是,OP可以使用
Rprof
来验证他是I/O绑定的。可能
fread
也在
数据表
包中。但不是上面的。我我使用下一步跳转到循环的下一步,这给了我(很抱歉没有提到这一点):{:task 11 failed中的
错误-“没有中断的循环/下一步,跳转到顶层”调用:%dopar%->
@crysis405 Well
next
是一种语言构造,它只在
中为
循环工作。
foreach
看起来像一个循环,但实际上它是一个函数调用,执行您提供的表达式(通过
%dopar%
,这也是一个函数)。你可以试着用
return
而不是
next
。但这并不能解决代码的问题,正如我在回答中所提到的那样。@crysis405不,不要试着这样做。这就像我点了一顿饭,2000名服务员用10万个盘子一次给我送来一粒米饭——一团乱。
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
}