Я не использовал ddply для распараллеливания сохраняемых объектов, поэтому я предполагаю, что файл становится намного больше, потому что когда вы сохраняете объект модели, он также несет некоторую информацию о среде, из которой он был сохранен.
Итак, используя приведенный выше код ddply, у меня есть следующие размеры:
sapply(dir(pattern="RData"),file.size)
setosa.RData versicolor.RData virginica.RData
36002 36002 36002
Существует два варианта, один из которых - использовать purrr / furrr:
library(furrr)
library(purrr)
func = function(SpeciesData){
Model <- lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",data = SpeciesData)
save(Model,
compress = FALSE,
file = gsub(x = "Species.RData",
pattern = "Species",
replacement = unique(SpeciesData$Species)))
}
split(iris,iris$Species) %>% future_map(func)
sapply(dir(pattern="RData"),file.size)
setosa.RData versicolor.RData virginica.RData
25426 27156 27156
Или использовать saveRDS (и ddply?), Поскольку у вас есть только один объект для сохранения:
ddply(.data = iris,
.variables = "Species",
.parallel=TRUE,##With parallel
.fun = function(SpeciesData){
Model <- lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",data = SpeciesData)
saveRDS(Model,
gsub(x = "Species.rds",
pattern = "Species",
replacement = unique(SpeciesData$Species)))
})
sapply(dir(pattern="rds"),file.size)
setosa.rds versicolor.rds virginica.rds
6389 6300 6277
Вы получите readRDS
вместо load
, чтобы получить файл:
m1 = readRDS("setosa.rds")
m1
Call:
lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",
data = SpeciesData)
Coefficients:
(Intercept) Sepal.Width Petal.Length Petal.Width
2.3519 0.6548 0.2376 0.2521
Мы можем взглянуть на коэффициенты в сравнении с объектом rda:
m2 = get(load("setosa.RData"))
m2
Call:
lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",
data = SpeciesData)
Coefficients:
(Intercept) Sepal.Width Petal.Length Petal.Width
2.3519 0.6548 0.2376 0.2521
Объекты не идентичны из-за частей среды, но с точки зрения предсказания или других вещей, для которых мы обычно его используем, это работает:
identical(predict(m1,data.frame(iris[1:10,])),predict(m2,data.frame(iris[1:10,])))