Прежде всего: используйте решение из другого вопроса, на который вы ссылаетесь, если вы хотите быть в безопасности. Поскольку R - это вызов по значению, забудьте о методе «на месте», который не копирует ваши кадры данных в память.
Один не рекомендуется метод сохранения большого количества памяти, это притворяться, что ваши фреймы данных являются списками, приводить список с помощью цикла for (apply будет использовать память как ад) и заставить R поверить в это на самом деле это датафрейм.
Я предупреждаю вас еще раз: использование этого на более сложных фреймах данных вызывает проблемы и трудно обнаруживаемые ошибки. Поэтому убедитесь, что вы тестируете достаточно хорошо, и, если возможно, избегайте этого как можно больше.
Вы можете попробовать следующий подход:
n1 <- 1000000
n2 <- 1000000
ncols <- 20
dtf1 <- as.data.frame(matrix(sample(n1*ncols), n1, ncols))
dtf2 <- as.data.frame(matrix(sample(n2*ncols), n1, ncols))
dtf <- list()
for(i in names(dtf1)){
dtf[[i]] <- c(dtf1[[i]],dtf2[[i]])
}
attr(dtf,"row.names") <- 1:(n1+n2)
attr(dtf,"class") <- "data.frame"
Он удаляет имена строк, которые у вас действительно были (вы можете восстановить их, но проверьте наличие дубликатов имен строк!). Он также не выполняет все другие тесты, включенные в rbind.
Сохраняет вам около половины памяти в моих тестах, и в моем тесте dtfcomb и dtf равны. Красное поле - rbind, желтое - мой подход, основанный на списках.
Тестовый скрипт:
n1 <- 3000000
n2 <- 3000000
ncols <- 20
dtf1 <- as.data.frame(matrix(sample(n1*ncols), n1, ncols))
dtf2 <- as.data.frame(matrix(sample(n2*ncols), n1, ncols))
gc()
Sys.sleep(10)
dtfcomb <- rbind(dtf1,dtf2)
Sys.sleep(10)
gc()
Sys.sleep(10)
rm(dtfcomb)
gc()
Sys.sleep(10)
dtf <- list()
for(i in names(dtf1)){
dtf[[i]] <- c(dtf1[[i]],dtf2[[i]])
}
attr(dtf,"row.names") <- 1:(n1+n2)
attr(dtf,"class") <- "data.frame"
Sys.sleep(10)
gc()
Sys.sleep(10)
rm(dtf)
gc()