Як я можу паралельно зберігати файли без автоматичного збільшення розміру файлу?


9

У мене є 2 сценарії, які роблять точно так само.

Але один сценарій створює 3 файли RData, які мають вагу 82,7 Кб, а другий сценарій, створюючи 3 файли RData, вагою 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 Як заблокувати доступ до файлу, поки він пише?
Діма Ха

@ Roger-123 Я намагаюся зменшити розмір пам'яті збережених файлів.
Діма Ха

@DimaHa може спробувати перейти в Google на щось подібне, r lang lock fileі через 5 секунд ви знайдете потрібний пакет cran.r-project.org/web/packages/filelock/filelock.pdf
Profesor08

Відповіді:


2

Як згадували інші, може бути незначна кількість інформації про оточуюче середовище, що зберігається у файлах, або подібне, яке ви, мабуть, не помітили, за винятком того, що файли такі малі.

Якщо вас просто цікавить розмір файлу, спробуйте зберегти моделі в єдиний список, а потім збережіть його в одному файлі. ddplyможе обробляти лише data.frame як результат функції, тому ми маємо використовувати її, 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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.