স্বয়ংক্রিয়ভাবে ফাইলের আকার না বাড়িয়ে আমি কীভাবে ফাইলগুলিকে সমান্তরালে সংরক্ষণ করতে পারি?


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

থ্রেড দ্বারা লেখার সময় আপনাকে ফাইলটিতে অ্যাক্সেস আটকাতে হবে। অন্য উপায়? ফাইলটি নষ্ট হয়ে যাবে।
08

@ অধ্যাপক08 ফাইলটি লেখার সময় আমি কীভাবে অ্যাক্সেসকে আটকাব?
দিমা হা

@ রজার -123 আমি সংরক্ষিত ফাইলগুলির মেমরির আকার হ্রাস করার চেষ্টা করি।
দিমা হা

@DimaHa ভালো কিছু google চেষ্টা করা যেতে পারে r lang lock fileএবং 5 সেকেন্ড পরে আপনি পছন্দসই প্যাকেজ পাবেন cran.r-project.org/web/packages/filelock/filelock.pdf
Profesor08

উত্তর:


2

অন্যরা যেমন উল্লেখ করেছে, ফাইলগুলি বা এর অনুরূপ পরিবেশে সংরক্ষণ করা হচ্ছে এমন পরিবেশ সম্পর্কে কিছুটা অল্প পরিমাণের তথ্য থাকতে পারে যা আপনি ফাইলগুলি এত ছোট বলে বাদে সম্ভবত লক্ষ্য করবেন না।

আপনি যদি কেবল ফাইল আকারে আগ্রহী হন, মডেলগুলিকে একক তালিকায় সংরক্ষণের চেষ্টা করুন এবং তারপরে এটি একটি ফাইলে সংরক্ষণ করুন। ddplyফাংশন থেকে ফলাফল হিসাবে কেবলমাত্র একটি ডেটা.ফ্রেমকে পরিচালনা করতে পারে, সুতরাং dlplyফলগুলি তালিকায় রাখার জন্য এটি বলার পরিবর্তে আমাদের ব্যবহার করতে হবে। এটি করার ফলে 60 কে-র একটি ফাইল সংরক্ষণ করা হয়েছিল।

আমি যা বলছি তার একটি উদাহরণ এখানে:

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

বা সেভআরডিএস ব্যবহার করুন (এবং ডিডিপ্লাই?) যেহেতু আপনার কেবলমাত্র সংরক্ষণ করার জন্য একটি জিনিস রয়েছে:

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  

আমরা আরডিএ অবজেক্টের সাথে তুলনা করে সহগকে দেখতে পারি:

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.