流处理R中的大型csv文件

我需要对一个非常大的csv文件(c.8.5GB)进行一些相对简单的更改.我最初尝试使用各种读取器函数:read.csv,readr :: read.csv,data.table :: fread.但是:它们都耗尽了内存.

我想我需要使用流处理方法;读取一个块,更新它,写入,重复.我找到了右边的this answer;但是我不知道如何终止循环(我对R来说相对较新).

所以我有两个问题:

>使while循环工作的正确方法是什么?
>有没有更好的方法(对于’更好’的某些定义)?例如是否有一些方法可以使用dplyr&管?

目前的代码如下:

src_fname <- "testdata/model_input.csv"
tgt_fname <- "testdata/model_output.csv"

#Changes needed in file: rebase identifiers, set another col to constant value
rebase_data <- function(data, offset) {
  data$'Unique Member ID' <- data$'Unique Member ID' - offset
  data$'Client Name' <- "TestClient2"
  return(data)
}

CHUNK_SIZE <- 1000
src_conn = file(src_fname, "r")
data <- read.csv(src_conn, nrows = CHUNK_SIZE, check.names=FALSE)
cols <- colnames(data)
offset <- data$'Unique Member ID'[1] - 1

data <- rebase_data(data, offset)
#1st time through, write the headers
tgt_conn = file(tgt_fname, "w")
write.csv(data,tgt_conn, row.names=FALSE)

#loop over remaining data
end = FALSE
while(end == FALSE) {
  data <- read.csv(src_conn, nrows = CHUNK_SIZE, check.names=FALSE, col.names = cols)
  data <- rebase_data(data, offset)
  #write.csv doesn't support col.names=FALSE; so use write.table which does
  write.table(data, tgt_conn, row.names=FALSE, col.names=FALSE, sep=",")
  # ??? How to test for EOF and set end = TRUE if so  ???
  # This doesn't work, presumably because nrow() != CHUNK_SIZE on final loop?
  if (nrow(data) < CHUNK_SIZE) {
    end <- TRUE
  }

}
close(src_conn)
close(tgt_conn)

谢谢你的任何指示.

最佳答案 试试这个:

library("chunked")

read_chunkwise(src_fname, chunk_size=CHUNK_SIZE) %>%
rebase_data(offset) %>%
write_chunkwise(tgt_fname)

您可能需要对字母进行一些调整以获得您想要的内容.

(免责声明:尚未尝试过代码)

请注意,包中没有插图,但标准用法在github:https://github.com/edwindj/chunked/中描述

点赞