ฉันจะบันทึกไฟล์แบบขนานโดยไม่เพิ่มขนาดไฟล์โดยอัตโนมัติได้อย่างไร


9

ฉันมี 2 สคริปต์ที่ทำสิ่งเดียวกัน

แต่หนึ่งสคริปต์กำลังสร้างไฟล์ RData 3 ไฟล์ที่มีน้ำหนัก 82.7 KB และอีกสคริปต์หนึ่งสร้างไฟล์ RData 3 ไฟล์ที่มีน้ำหนัก 120 KB

คนแรกไม่มีขนาน:

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%

ฉันจะบันทึกไฟล์แบบขนานโดยไม่เพิ่มขนาดไฟล์โดยอัตโนมัติได้อย่างไร


คุณกำลังมองหาที่จะลดขนาดไฟล์โดยรวมของรุ่นหรือเป็นความอยากรู้ทางเทคนิคเพิ่มเติมเกี่ยวกับสาเหตุที่ไฟล์มีขนาดใหญ่กว่า? เป้าหมายใหญ่ที่คุณกำลังมองหาคืออะไร?
Roger-123

คุณต้องปิดกั้นการเข้าถึงไฟล์ในขณะที่กำลังเขียนโดยเธรด อีกทางหนึ่ง? ไฟล์จะแตก
Profesor08

@ Profesor08 ฉันจะบล็อกการเข้าถึงไฟล์ในขณะที่กำลังเขียนได้อย่างไร?
Dima Ha

@ Roger-123 ฉันพยายามลดขนาดหน่วยความจำของไฟล์ที่บันทึกไว้
Dima Ha

@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 เพื่อทำให้ขนานกับวัตถุที่บันทึกดังนั้นฉันเดาว่าไฟล์จะใหญ่ขึ้นมากเพราะเมื่อคุณบันทึก model object มันก็มีข้อมูลเกี่ยวกับสภาพแวดล้อมที่มันถูกบันทึกไว้ด้วย

ดังนั้นเมื่อใช้รหัส 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,])))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.