Come posso salvare i file in parallelo senza aumentare automaticamente le dimensioni del file?


9

Ho 2 script che fanno esattamente lo stesso.

Ma uno script produce 3 file RData del peso di 82,7 KB e l'altro script crea 3 file RData del peso di 120 KB.

il primo è senza parallelo:

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

 })

Il secondo è con parallelo:

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)

il secondo script crea file che pesano il 42% in più.

Come posso salvare i file in parallelo senza aumentare automaticamente le dimensioni del file?


Stai cercando di ridurre la dimensione complessiva dei file dei modelli o questa curiosità tecnica è più grande del perché i file sono più grandi? Qual è l'obiettivo più grande che stai cercando?
Roger-123,

Devi bloccare l'accesso al file, mentre sta scrivendo dal thread. Un altro modo? il file verrà rotto.
Profesor08,

@ Profesor08 Come blocco l'accesso al file mentre sta scrivendo?
Dima Ha,

@ Roger-123 Provo a ridurre la dimensione della memoria dei file salvati.
Dima Ha,

@DimaHa potrebbe provare a google qualcosa del genere r lang lock filee dopo 5 secondi troverai il pacchetto desiderato cran.r-project.org/web/packages/filelock/filelock.pdf
Profesor08

Risposte:


2

Come altri hanno già detto, potrebbero esserci alcune piccole quantità di informazioni sull'ambiente che vengono salvate nei file o simili che probabilmente non noteresti se non che i file sono così piccoli.

Se ti interessa solo la dimensione del file, prova a salvare i modelli in un unico elenco e quindi salvali in un unico file. ddplypuò solo gestire un data.frame come risultato della funzione, quindi dobbiamo usare dlplyinvece per dirgli di memorizzare i risultati in un elenco. In questo modo salvato in un solo file che era 60k.

Ecco un esempio di ciò di cui sto parlando:

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

Non ho usato ddply per parallelizzare il salvataggio di oggetti, quindi immagino che il file diventi molto più grande perché quando salvi un oggetto modello, acquisisce anche alcune informazioni sull'ambiente da cui viene salvato.

Quindi usando il tuo codice ddply sopra, le dimensioni che ho sono:

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

Ci sono due opzioni, una è usare 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

O per usare saveRDS (e ddply?) Poiché hai un solo oggetto da salvare:

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 

Farai readRDSinvece di loadottenere il file:

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  

Possiamo guardare i coefficienti rispetto all'oggetto 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  

Gli oggetti non sono identici a causa delle parti dell'ambiente, ma in termini di previsione o altre cose per cui normalmente lo usiamo, funziona:

identical(predict(m1,data.frame(iris[1:10,])),predict(m2,data.frame(iris[1:10,])))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.