Чтение csv файлов в чанках с помощью `readr::read_csv_chunked()`
Я хочу прочитать большие 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()
, но я все еще получил ту же ошибку.
1 ответ
Я понял, что функция, которая будет вызвана в DataFrameCallback$new()
всегда должен быть один дополнительный аргумент (pos
в примере из документации). Этот аргумент не нужно использовать, поэтому я не совсем понимаю его назначение. Но, по крайней мере, так работает.
Кто-нибудь знает более подробную информацию об этом втором аргументе?
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)