Làm cách nào để lưu tệp song song mà không tự động tăng kích thước tệp?


9

Tôi có 2 kịch bản làm giống hệt nhau.

Nhưng một tập lệnh đang tạo ra 3 tệp RData có trọng lượng 82,7 KB và tập lệnh khác tạo 3 tệp RData có trọng lượng 120 KB.

cái đầu tiên không có song song:

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

 })

Thứ hai là song song:

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)

tập lệnh thứ hai tạo ra các tập tin nặng hơn 42%.

Làm cách nào để lưu tệp song song mà không tự động tăng kích thước tệp?


Bạn đang tìm cách giảm kích thước tập tin tổng thể của các mô hình hay đây là sự tò mò kỹ thuật hơn về lý do tại sao các tập tin lớn hơn? Mục tiêu lớn hơn mà bạn đang tìm kiếm là gì?
Roger-123

Bạn phải chặn quyền truy cập vào tập tin, trong khi nó được viết bởi luồng. Cách khác? tập tin sẽ bị hỏng
Profesor08

@ Profesor08 Làm cách nào để chặn quyền truy cập vào tệp khi đang viết?
Dima Ha

@ Roger-123 Tôi cố gắng giảm kích thước bộ nhớ của các tệp đã lưu.
Dima Ha

@DimaHa có thể thử google một cái gì đó như thế r lang lock filevà sau 5 giây, bạn sẽ tìm thấy gói cran.r-project.org/web/packages/filelock/filelock.pdf
Profesor08

Câu trả lời:


2

Như những người khác đã đề cập, có thể có một số lượng nhỏ thông tin về môi trường được lưu trong các tệp hoặc tương tự mà bạn có thể không nhận thấy ngoại trừ các tệp quá nhỏ.

Nếu bạn chỉ quan tâm đến kích thước tệp, hãy thử lưu các mô hình vào một danh sách và sau đó lưu nó vào một tệp. ddplychỉ có thể xử lý data.frame là kết quả từ hàm, vì vậy chúng ta phải sử dụng dlplythay vào đó để bảo nó lưu trữ kết quả trong danh sách. Làm điều này lưu vào chỉ một tập tin là 60k.

Đây là một ví dụ về những gì tôi đang nói về:

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

Tôi chưa sử dụng ddply để song song lưu các đối tượng, vì vậy tôi đoán tệp sẽ lớn hơn nhiều vì khi bạn lưu đối tượng mô hình, nó cũng mang một số thông tin về môi trường mà nó được lưu.

Vì vậy, sử dụng mã ddply của bạn ở trên, kích thước tôi có là:

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

Có hai tùy chọn, một là sử dụng 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

Hoặc để sử dụng saveRDS (và ddply?) Vì bạn chỉ có một đối tượng để lưu:

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 

Bạn sẽ làm readRDSthay vì loadlấy tệp:

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  

Chúng ta có thể xem xét các hệ số so với đối tượng 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  

Các đối tượng không giống nhau do các bộ phận môi trường, nhưng về mặt dự đoán hoặc các thứ khác mà chúng ta thường sử dụng cho nó, nó hoạt động:

identical(predict(m1,data.frame(iris[1:10,])),predict(m2,data.frame(iris[1:10,])))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.