我一次只读一行大文件。我想要加快一切的目的是并行处理多行。但我现在这样做的方式并不奏效。我从未尝试过这个,所以我不确定它是如何工作的。
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
}
答案 0 :(得分:2)
你还没有说明什么是“不起作用”的意思但是我正在说它并没有像预期的那样加速(虽然我也不太清楚你的语义'试图这样做。)
原因是你的代码不是计算绑定的,它是IO绑定的。意思是,它必须等待来自二级存储的数据。该数据的总线不是并行的,因此所有数据读取请求都会被序列化。通过以您尝试的方式使用并行性,您无法显着提高速度。
事实上,如果你一次性完成阅读并依靠R来做正确的事情,你的代码可能会加速。如果你真的需要原始阅读性能,你可能需要求助于内存映射文件。一个快速的谷歌搜索出现了实现这一点的R package bigmemory
。