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

der*_*und 5 csv r 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)
Run Code Online (Sandbox Code Playgroud)

我试图让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)
Run Code Online (Sandbox Code Playgroud)

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

eval中的错误(替换(expr),envir,enclos):未使用的参数(索引)

我已经尝试将我想要的操作包含在其中f(),但我仍然遇到了同样的错误.

苏东远*_*苏东远 6

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

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

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

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)
Run Code Online (Sandbox Code Playgroud)


der*_*und 5

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

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