r - 如何在不自动增加文件大小的情况下并行保存文件?

标签 r plyr

我有2个脚本,它们做的完全一样。

但是一个脚本正在生成3个重82.7 KB的RData文件,另一个脚本正在创建3个重120 KB的RData文件。

第一个没有并行:

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,])))

关于r - 如何在不自动增加文件大小的情况下并行保存文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60246849/

相关文章:

r - ddply 调用中的 prop.table

reshape 包掩码防止熔化命名列

r - 将每个组的多个箱线图分层

r - 我如何使 doSMP 与 plyr 一起很好地发挥作用?

R:使用plyr在两个数据源的匹配子集之间进行模糊字符串匹配

r - 结合使用 pivot_longer 和 pivot_wider

r - 再次 : Setting the environment within a function

r - R图中的 Axis 如何获得Λ

c++ - 如何使用 C++ 中的 Eigen 库加速我的函数?

r - 将数据因子转换为日期