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 Wellnext
是一种语言构造,它只在中为循环工作。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
}