ファイルサイズを自動的に増加させずにファイルを並行して保存するにはどうすればよいですか?


9

まったく同じことを行う2つのスクリプトがあります。

しかし、1つのスクリプトは82.7 KBの重みを持つ3つのRDataファイルを作成し、もう1つのスクリプトは120 KBの重みを持つ3つの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)))

 })

2つ目はパラレルを使用する場合です。

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)

2番目のスクリプトは、重みが42%多いファイルを作成します。

ファイルサイズを自動的に増加させずにファイルを並行して保存するにはどうすればよいですか?


モデルの全体的なファイルサイズを小さくすることを考えていますか、それともファイルが大きい理由についての技術的な好奇心ですか?あなたが探しているより大きな目標は何ですか?
ロジャー123

スレッドによる書き込み中は、ファイルへのアクセスをブロックする必要があります。別の方法?ファイルは壊れます。
Profesor08

@ Profesor08書き込み中にファイルへのアクセスをブロックするにはどうすればよいですか?
Dima Ha

@ Roger-123保存したファイルのメモリサイズを減らしてみます。
Dima Ha

@DimaHaは次のようなものをグーグル化しようとする可能性がr lang lock fileあり、5秒後に目的のパッケージcran.r-project.org/web/packages/filelock/filelock.pdf
Profesor08

回答:


2

他の人が述べたように、ファイルなどに保存されている環境について、ファイルが非常に小さいことを除いて、おそらく気付かないような少量の情報があるかもしれません。

ファイルサイズだけに関心がある場合は、モデルを1つのリストに保存してから、1つのファイルに保存してみてください。 ddply関数の結果としてはdata.frameしか処理できないため、dlply代わりにを使用して、結果をリストに格納するように指示する必要があります。これを行うと、60kのファイルが1つだけ保存されます。

これが私が話していることの例です:

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')

3

オブジェクトの保存を並列化するためにddplyを使用していないので、モデルオブジェクトを保存すると、保存元の環境に関する情報も含まれるため、ファイルが非常に大きくなると思います。

上記のddplyコードを使用すると、サイズは次のようになります。

sapply(dir(pattern="RData"),file.size)
setosa.RData versicolor.RData  virginica.RData 
       36002            36002            36002 

2つのオプションがあり、1つは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

または、保存するオブジェクトが1つしかないため、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,])))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.