Как перебирать несколько файлов .csv, где каждый файл должен быть прочитан по частям из-за нехватки оперативной памяти в r

#r #large-files

Вопрос:

У меня есть большой набор данных, состоящий из нескольких файлов .csv. Каждый файл .csv занимает около 5-10 ГБ, что слишком много и отнимает много времени для оперативной памяти моего компьютера. Чтобы решить проблему, я подумал о создании фрагментов (скажем, Chunk = 1000), но при вставке его в мой код он повторяется только в первых 1000 строках. Вот пример кода:

 # Trying to make a for loop iteration through multiple files
## Attempt - with CON. (Does not iterate for each chunk through the files)
library(tidyverse)
library(fs)

file_paths <- fs::dir_ls("path/to/folder")
file_contents <- list()
chunkSize = 1000

for(i in seq_along(file_paths)){
  # Open a connection to file i in readable format
  con = file(file_paths[[i]], "r")
  # Assign to empty list, and read in data in chunks
  file_contents[[i]] <- read.csv(con, nrows = chunkSize)
}
close(con)

# set name to each of the file paths
file_contents <- set_names(file_contents, file_paths)
 

Комментарии:

1. Вы читаете только первые 1000 строк каждого файла. Вам нужен внутренний цикл для чтения последующих фрагментов каждого файла, пока вы не дойдете до конца файла. Кроме того, вы close(con) , вероятно, должны быть внутри (внешнего) цикла.

2. Вам это помогает? youtube.com/watch?v=9nHsfkYZSUA

3. Я не понимаю. file_paths[i] является одним элементом вектора. конечно, его длина равна 1. Что вы получаете от length(file_paths) этого ?