Ответ 1
Я смог выполнить это, используя обратную связь от другой публикации в Stackoverflow. Процесс был очень быстрым, и 40 ГБ данных были прочитаны примерно через 10 минут, используя итеративно. Foreach-dopar не работал, когда запускался сам по себе, чтобы читать файлы в новые data.tables последовательно из-за некоторых ограничений, которые также упоминаются на странице ниже.
Примечание. Список файлов (file_map) был подготовлен простым запуском -
file_map <- list.files(pattern="test.$") # Replace pattern to suit your requirement
mclapply с большими объектами - сериализация слишком велика для хранения в необработанном векторе
Цитата -
collector = vector("list", length(file_map)) # more complex than normal for speed
for(index in 1:length(file_map)) {
reduced_set <- mclapply(file_map[[index]], function(x) {
on.exit(message(sprintf("Completed: %s", x)))
message(sprintf("Started: '%s'", x))
fread(x) # <----- CHANGED THIS LINE to fread
}, mc.cores=10)
collector[[index]]= reduced_set
}
# Additional line (in place of rbind as in the URL above)
for (i in 1:length(collector)) { rbindlist(list(finalList,yourFunction(collector[[i]][[1]]))) }
# Replace yourFunction as needed, in my case it was an operation I performed on each segment and joined them with rbindlist at the end.
Моя функция включала цикл с использованием Foreach dopar, который выполнялся через несколько ядер на файл, как указано в file_map. Это позволило мне использовать допар, не сталкиваясь с "слишком большой ошибкой сериализации" при работе в объединенном файле.
Другое полезное сообщение - загрузка файлов параллельно, не работающая с foreach + data.table