импорт ndjson в R пропустить первые n строк - PullRequest
0 голосов
/ 12 ноября 2018

Как прочитать большой файл ndjson (20 ГБ) по фрагменту в R?

У меня есть большой файл данных, который я хочу прочитать 1M строк за раз.

В настоящее время я использую приведенный ниже код для загрузки данных в R.

jsonlite::stream_in(
  file(fileName)
)

Но мне не нужно загружать все данные вместе. Как я могу разбить этот файл на куски, чтобы загрузить быстрее?

1 Ответ

0 голосов
/ 13 ноября 2018

Если вы не хотите повышать уровень и использовать Drill, это будет работать в любой системе zcat (или gzcat) и sed live:

stream_in_range <- function(infile, start, stop, cat_kind = c("gzcat", "zcat")) {

  infile <- path.expand(infile)
  stopifnot(file.exists(infile))

  gzip <- (tools::file_ext(infile) == "gz")
  if (gzip) cat_kind <- match.arg(cat_kind, c("gzcat", "zcat"))

  start <- as.numeric(start[1])
  stop <- as.numeric(stop[1])

  sed_arg <- sprintf("%s,%sp;", start, stop, (stop+1))

  sed_command <- sprintf("sed -n '%s'", sed_arg)

  if (gzip) {
    command <- sprintf("%s %s | %s ", cat_kind, infile, sed_command)
  } else {
    command <- sprintf("%s %s", sed_command, infile)
  }

  ndjson::flatten(system(command, intern=TRUE), "tbl")

}

stream_in_range("a-big-compressed-ndjson-file.json.gz", 100, 200)

stream_in_range("a-big-uncompressed-nsjdon-file.json", 1, 10)

Выберите и /или добавьте другой cat_kind для того, что работает для вас.

...