我试图在10000行的连续块中读取一个大文件。这是 因为文件太大而无法立即读入。 read.csv的“skip”字段出现在 方便完成这项任务(见下文)。但是我注意到程序启动了 减慢到文件的末尾(对于i的大值)。 我怀疑这是因为每次调用read.csv(file,skip = nskip,nrows = block)总是如此 从头开始读取文件,直到所需的起始行“跳过”为止 到达。随着我的增加,这变得越来越耗时。 问题:有没有办法从最后一个位置开始继续读取文件 在上一个街区达成了?
numberOfBlocksInFile<-800
block<-10000
for ( i in 1:(n-1))
{
print(i)
nskip<-i*block
out<-read.csv(file,skip=nskip,nrows=block)
colnames(out)<-names
.....
print("keep going")
}
many thanks (:-
答案 0 :(得分:1)
一种方法是将readLines
与文件连接一起使用。例如,你可以这样做:
temp.fpath <- tempfile() # create a temp file for this demo
d <- data.frame(a=letters[1:10], b=1:10) # sample data, 10 rows. we'll read 5 at a time
write.csv(d, temp.fpath, row.names=FALSE) # write the sample data
f.cnxn <- file(temp.fpath, 'r') # open a new connection
fields <- readLines(f.cnxn, n=1) # read the header, which we'll reuse for each block
block.size <- 5
repeat { # keep reading and printing 5 row chunks until you reach the end of the cnxn.
block.text <- readLines(f.cnxn, n=5) # read chunk
if (length(block.text) == 0) # if there's nothing left, leave the loop
break
block <- read.csv(text=c(fields, block.text)) # process chunk with
print(block)
}
close(f.cnxn)
file.remove(temp.fpath)
答案 1 :(得分:0)
另一种选择是使用fread
包中的read.table
。
N <- 1e6 ## 1 second to read 1e6 rows/10cols
skip <- N
DT <- fread("test.csv",nrows=N)
repeat {
if (nrow(DT) < N) break
DT <- fread("test.csv",nrows=N,skip=skip)
## here use DT for your process
skip <- skip + N
}