मैं फ़ाइल का आकार स्वचालित रूप से बढ़ाए बिना समानांतर में फ़ाइलों को कैसे सहेज सकता हूं?


9

मेरे पास 2 स्क्रिप्ट हैं जो बिल्कुल वैसा ही कर रही हैं।

लेकिन एक स्क्रिप्ट 3 आरडीएटा फाइलों का उत्पादन कर रही है जो 82.7 केबी वजन की है, और दूसरी स्क्रिप्ट 3 आरडीएटा फाइलें बना रही है जो 120 केबी वजन की है।

पहला समानांतर के बिना है:

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% अधिक वजन वाली फाइलें बनाती है।

मैं फ़ाइल का आकार स्वचालित रूप से बढ़ाए बिना समानांतर में फ़ाइलों को कैसे सहेज सकता हूं?


क्या आप मॉडलों के समग्र फ़ाइल आकार को कम करना चाहते हैं या क्या यह अधिक तकनीकी जिज्ञासा है कि फाइलें बड़ी क्यों हैं? आप किस बड़े लक्ष्य की तलाश में हैं?
रोजर -123

आपको फ़ाइल तक पहुंच को ब्लॉक करना होगा, जबकि यह थ्रेड द्वारा लिख ​​रहा है। दूसरा रास्ता? फाइल तोड़ी जाएगी।
Profesor08

@ Profesor08 यह लिखते समय मैं फ़ाइल तक पहुँच कैसे रोक सकता हूँ?
दिमा हा

@ रोजर -123 मैं बचाई गई फाइलों की मेमोरी साइज को कम करने की कोशिश करता हूं।
दिमा हा

@DimaHa की तरह कुछ गूगल करने की कोशिश की जा सकती है r lang lock fileऔर 5 सेकंड के बाद आप इच्छित पैकेज मिलेगा cran.r-project.org/web/packages/filelock/filelock.pdf
Profesor08

जवाबों:


2

जैसा कि दूसरों ने उल्लेख किया है, पर्यावरण के बारे में कुछ छोटी-छोटी जानकारी हो सकती है जो फाइलों में या इसी तरह से बचाई जा रही हैं कि आप शायद नोटिस नहीं करेंगे सिवाय इसके कि फाइलें इतनी छोटी हैं।

यदि आप फ़ाइल आकार में रुचि रखते हैं, तो मॉडल को एक सूची में सहेजने का प्रयास करें और फिर उसे एक फ़ाइल में सहेजें। ddplyकेवल फ़ंक्शन से परिणाम के रूप में एक डेटा.फ्रेम को संभाल सकता है, इसलिए हमें 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')

3

मैंने सहेजने वाली वस्तुओं को समानांतर करने के लिए 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,])))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.