Dosya boyutunu otomatik olarak büyütmeden dosyaları paralel olarak nasıl kaydedebilirim?


9

Ben aynı şeyi yapan 2 script var.

Ancak bir komut dosyası 82,7 KB ağırlığında 3 RData dosyası ve diğer komut dosyası 120 KB ağırlığında 3 RData dosyası oluşturur.

ilki paralel olmayan:

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

 })

İkincisi paraleldir:

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)

ikinci komut dosyası% 42 daha fazla dosya oluşturur.

Dosya boyutunu otomatik olarak büyütmeden dosyaları paralel olarak nasıl kaydedebilirim?


Modellerin toplam dosya boyutunu küçültmek mi istiyorsunuz, yoksa dosyaların neden daha büyük olduğu konusunda daha teknik bir merak mı var? Aradığınız daha büyük hedef nedir?
Roger-123

İleti dizisi tarafından yazılırken dosyaya erişimi engellemeniz gerekir. Diğer yol? dosya bozulacak.
Profesor08

@ Profesor08 Yazarken dosyaya erişimi nasıl engellerim?
Dima Ha

@ Roger-123 Kaydedilen dosyaların bellek boyutunu azaltmaya çalışıyorum.
Dima Ha

@DimaHa gibi bir şey google denemek olabilir r lang lock fileve 5 saniye sonra istediğiniz paketi cran.r-project.org/web/packages/filelock/filelock.pdf
Profesor08

Yanıtlar:


2

Diğerlerinin de belirttiği gibi, dosyalara kaydedilen ortam veya dosyalarla ilgili çok küçük bilgiler olabilir, ancak dosyaların çok küçük olması dışında muhtemelen fark etmeyeceksiniz.

Yalnızca dosya boyutuyla ilgileniyorsanız, modelleri tek bir listeye kaydetmeyi deneyin ve ardından tek bir dosyaya kaydedin. ddplydata.frame işlevini yalnızca işlevin bir sonucu olarak işleyebilir; bu nedenle dlply, sonuçları bir listede saklamasını söylemek için kullanmamız gerekir. Bunu yaptığınızda 60k olan tek bir dosyaya kaydedildi.

İşte neden bahsettiğime bir örnek:

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

Kaydetme nesneleri paralelleştirmek için ddply kullanmadım, bu yüzden model nesneyi kaydettiğinizde, aynı zamanda kaydedildiği ortam hakkında bazı bilgiler taşır çünkü dosya çok daha büyük olur sanırım.

Yukarıdaki ddply kodunuzu kullanarak, sahip olduğum boyutlar:

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

İki seçenek vardır, biri purrr / furrr kullanmaktır:

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

Ya da kaydedilecek tek bir nesneniz olduğundan saveRDS (ve ddply?) Öğesini kullanmak için:

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 

Dosyayı almak readRDSyerine yapacaksınız 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 nesnesiyle karşılaştırıldığında katsayılara bakabiliriz:

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  

Ortam parçaları nedeniyle nesneler aynı değildir, ancak normalde kullandığımız tahmin veya diğer şeyler açısından işe yarar:

identical(predict(m1,data.frame(iris[1:10,])),predict(m2,data.frame(iris[1:10,])))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.