如何在不自动增加文件大小的情况下并行保存文件?
How can I save files in parallel without automatically increasing the file size?
我有 2 个脚本完全一样。
但是一个脚本生成 3 个 RData 文件,权重为 82.7 KB,而另一个脚本生成 3 个 RData 文件,权重为 120 KB。
第一个没有水货:
library("plyr")
ddply(.data = iris,
.variables = "Species",
##.parallel=TRUE,##Without parallel
.fun = function(SpeciesData){
#Create Simple Model -------------------------------------------------------------
Model <- lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",data = SpeciesData)
#Save The Model -------------------------------------------------------------
save(Model,
compress = FALSE,
file = gsub(x = "Species.RData",
pattern = "Species",
replacement = unique(SpeciesData$Species)))
})
第二个是并行的:
library("plyr")
doSNOW::registerDoSNOW(cl<-snow::makeCluster(3))
ddply(.data = iris,
.variables = "Species",
.parallel=TRUE,##With parallel
.fun = function(SpeciesData){
#Create Simple Model -------------------------------------------------------------
Model <- lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",data = SpeciesData)
#Save The Model -------------------------------------------------------------
save(Model,
compress = FALSE,
file = gsub(x = "Species.RData",
pattern = "Species",
replacement = unique(SpeciesData$Species)))
})
snow::stopCluster(cl)
第二个脚本创建的文件权重增加了 42%。
如何在不自动增加文件大小的情况下并行保存文件?
我没有使用 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,])))
正如其他人所提到的,可能有一些关于保存在文件或类似文件中的环境信息,除非文件很小,否则您可能不会注意到这些信息。
如果您只对文件大小感兴趣,请尝试将模型保存到一个列表中,然后将其保存到一个文件中。 ddply
只能处理 data.frame 作为函数的结果,因此我们必须使用 dlply
来告诉它将结果存储在列表中。这样做只保存了一个 60k 的文件。
这是我所说的一个例子:
library("plyr")
doSNOW::registerDoSNOW(cl<-snow::makeCluster(3))
models<-dlply(.data = iris,
.variables = "Species",
.parallel=TRUE,##With parallel
.fun = function(SpeciesData){
#Create Simple Model -------------------------------------------------------------
lm(formula = Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, data = SpeciesData)
})
snow::stopCluster(cl)
save(models, compress= FALSE, file= 'combined_models')
我有 2 个脚本完全一样。
但是一个脚本生成 3 个 RData 文件,权重为 82.7 KB,而另一个脚本生成 3 个 RData 文件,权重为 120 KB。
第一个没有水货:
library("plyr")
ddply(.data = iris,
.variables = "Species",
##.parallel=TRUE,##Without parallel
.fun = function(SpeciesData){
#Create Simple Model -------------------------------------------------------------
Model <- lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",data = SpeciesData)
#Save The Model -------------------------------------------------------------
save(Model,
compress = FALSE,
file = gsub(x = "Species.RData",
pattern = "Species",
replacement = unique(SpeciesData$Species)))
})
第二个是并行的:
library("plyr")
doSNOW::registerDoSNOW(cl<-snow::makeCluster(3))
ddply(.data = iris,
.variables = "Species",
.parallel=TRUE,##With parallel
.fun = function(SpeciesData){
#Create Simple Model -------------------------------------------------------------
Model <- lm(formula = "Sepal.Length~Sepal.Width+Petal.Length+Petal.Width",data = SpeciesData)
#Save The Model -------------------------------------------------------------
save(Model,
compress = FALSE,
file = gsub(x = "Species.RData",
pattern = "Species",
replacement = unique(SpeciesData$Species)))
})
snow::stopCluster(cl)
第二个脚本创建的文件权重增加了 42%。
如何在不自动增加文件大小的情况下并行保存文件?
我没有使用 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,])))
正如其他人所提到的,可能有一些关于保存在文件或类似文件中的环境信息,除非文件很小,否则您可能不会注意到这些信息。
如果您只对文件大小感兴趣,请尝试将模型保存到一个列表中,然后将其保存到一个文件中。 ddply
只能处理 data.frame 作为函数的结果,因此我们必须使用 dlply
来告诉它将结果存储在列表中。这样做只保存了一个 60k 的文件。
这是我所说的一个例子:
library("plyr")
doSNOW::registerDoSNOW(cl<-snow::makeCluster(3))
models<-dlply(.data = iris,
.variables = "Species",
.parallel=TRUE,##With parallel
.fun = function(SpeciesData){
#Create Simple Model -------------------------------------------------------------
lm(formula = Sepal.Length~Sepal.Width+Petal.Length+Petal.Width, data = SpeciesData)
})
snow::stopCluster(cl)
save(models, compress= FALSE, file= 'combined_models')