我想阅读更大的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()
中包含我想要进行的操作,但我仍然遇到同样的错误。
答案 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)