9

我想读取更大的 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(替代(expr),envir,enclos)中的错误:未使用的参数(索引)

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

4

2 回答 2

8

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

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

于 2017-05-02T09:22:21.877 回答
3

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

以下是来自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)
于 2019-06-05T04:43:09.470 回答