使用`readr :: read_csv_chunked()`读取块中的csv文件

时间:2017-04-28 09:52:42

标签: r csv chunks readr

我想阅读更大的csv文件但遇到内存问题。因此,我想尝试使用read_csv_chunked()包中readr的块来阅读它们。我的问题是我不太了解callback论证。

这是我到目前为止尝试过的最小例子(我知道我必须将所需的操作包含在f()中,否则就内存使用而言不会有一个优点,对吧?):

library(tidyverse)
data(diamonds)
write_csv(diamonds, "diamonds.csv") # to have a csv to read

f <- function(x) {x}
diamonds_chunked <- read_csv_chunked("diamonds.csv", 
                                     callback = DataFrameCallback$new(f),
                                     chunk_size = 10000)

我试图将callback参数保留在官方文档中的示例附近:

# Cars with 3 gears
f <- function(x, pos) subset(x, gear == 3)
read_csv_chunked(readr_example("mtcars.csv"), 
                 DataFrameCallback$new(f), 
                 chunk_size = 5)

但是,我收到下面的错误,因为我看到进度条移动到18%后,似乎在第一个块被读取后出现。

  

eval中的错误(substitute(expr),envir,enclos):unused argument(index)

我已经尝试在f()中包含我想要进行的操作,但我仍然遇到同样的错误。

2 个答案:

答案 0 :(得分:5)

我发现在DataFrameCallback$new()中调用的函数总是需要有一个额外的参数(文档中的示例中为pos)。不必使用这个论点,所以我真的不明白它的目的。但至少,它是这样运作的。

有没有人知道关于这第二个论点的更多细节?

答案 1 :(得分:2)

pos表示位置,它是每个块中第一行的索引号。使用此回调函数,您可以处理块中的每一行。

以下是来自的官方示例 https://readr.tidyverse.org/reference/callback.html

  

ChunkCallback 回调接口定义,所有回调   函数应该从此类继承。

     

SideEffectChunkCallback 回调函数,仅用于侧面   效果,不会返回任何结果。

     

DataFrameCallback 回调函数,将每个结果组合在一起   最后。

     

AccumulateCallBack 回调函数,用于累积单个结果。   需要参数acc来指定参数的初始值   累加器。默认情况下,参数acc为NULL。

# Print starting line of each chunk
f <- function(x, pos) print(pos)
read_lines_chunked(readr_example("mtcars.csv"), SideEffectChunkCallback$new(f), chunk_size = 5)

# The ListCallback can be used for more flexible output
f <- function(x, pos) x$mpg[x$hp > 100]
read_csv_chunked(readr_example("mtcars.csv"), ListCallback$new(f), chunk_size = 5)