การตรวจสอบและจัดการหน่วยความจำ

การเขียนโปรแกรมแบบขนานใน R

Nabeel Imam

Data Scientist

คิวและพื้นที่

พนักงานแคชเชียร์สามคนให้บริการลูกค้าที่ธนาคาร ขณะที่ลูกค้าบางส่วนรอคิวอยู่

การเขียนโปรแกรมแบบขนานใน R

การทำงานแบบขนาน

แผนภาพแสดง parallel flow ที่งานหนึ่งถูกแบ่งเป็นงานย่อยหลายส่วน แต่ละส่วนประมวลผลโดย core ต่างกัน แล้วนำผลมารวมกัน

การเขียนโปรแกรมแบบขนานใน R

การทำงานแบบขนาน

ขั้นตอนการทำงานแบบขนานทั้งหมดอยู่ภายใน RAM

การเขียนโปรแกรมแบบขนานใน R

ข้อมูล births

print(ls_files)
 [1] "./births/AK.csv"
 [2] "./births/AL.csv"
 [3] "./births/AR.csv"
 [4] "./births/AZ.csv"
 [5] "./births/CA.csv"
 [6] "./births/CO.csv"
 [7] "./births/CT.csv"
 [8] "./births/DC.csv"
 [9] "./births/DE.csv"
 [10] "./births/FL.csv"
...
การเขียนโปรแกรมแบบขนานใน R

การ map ด้วย futures

plan(multisession, workers = 2)

ls_df <- future_map(ls_files, read.csv)
plan(sequential)
print(ls_df)
[[1]]
   state month plurality weight_gain_pounds mother_age
      AK     1         1                 30         43
   ...
[[2]]
   state month plurality weight_gain_pounds mother_age
      AL    10         1                 60         33
   ...
...
การเขียนโปรแกรมแบบขนานใน R

การ profiling ด้วย 2 workers

profvis({
  plan(multisession, workers = 2)
  ls_df <- future_map(ls_files, read.csv)
  plan(sequential)
})

ผลลัพธ์การ profiling โค้ดจากฟังก์ชัน profvis การอ่านไฟล์ CSV แบบขนานด้วย 2 workers โดยใช้ future_map ใช้หน่วยความจำ 1.6 เมกะไบต์ ส่วนบรรทัดอื่นไม่มีการใช้งานที่บันทึกได้

การเขียนโปรแกรมแบบขนานใน R

การ profiling ด้วย 4 workers

profvis({
  plan(multisession, workers = 4)
  ls_df <- future_map(ls_files, read.csv)
  plan(sequential)
})

ผลลัพธ์การ profiling โค้ดจากฟังก์ชัน profvis การอ่านไฟล์ CSV แบบขนานด้วย 4 workers โดยใช้ future_map ใช้หน่วยความจำ 3.1 เมกะไบต์ และการวางแผน multisession ใช้ 0.3 เมกะไบต์

การเขียนโปรแกรมแบบขนานใน R

เบื้องหลังการทำงาน

แผนที่สหรัฐอเมริกาแบ่งออกเป็น 4 ภูมิภาค ได้แก่ West, Midwest, South และ Northeast แต่ละภูมิภาคสอดคล้องกับรายการไฟล์ CSV ที่มีข้อมูลของแต่ละรัฐในภูมิภาคนั้น

การเขียนโปรแกรมแบบขนานใน R

จัดการหน่วยความจำด้วยการแบ่ง chunk

config <- furrr_options(chunk_size = 26)

plan(multisession, workers = 4) ls_df <- future_map(ls_files, read.csv,
.options = config) plan(sequential)
การเขียนโปรแกรมแบบขนานใน R

จัดการหน่วยความจำด้วยการแบ่ง chunk

profvis({
  config <- furrr_options(chunk_size = 26)
  plan(multisession, workers = 4)
  ls_df <- future_map(ls_files, read.csv,
             .options = config)
  plan(sequential)
})

ผลลัพธ์การ profiling โค้ดจากฟังก์ชัน profvis การอ่านไฟล์ CSV แบบขนานด้วย 4 workers โดยใช้ future_map ใช้หน่วยความจำ 2.5 เมกะไบต์ เมื่อกำหนด chunk size เป็น 26

การเขียนโปรแกรมแบบขนานใน R

การแบ่ง chunk ด้วย parallel

cl <- makeCluster(4)


ls_df <- parLapply(cl, ls_files, read.csv)
stopCluster(cl)

การอ่านไฟล์ CSV แบบขนานด้วย parLapply ใช้หน่วยความจำ 2.4 เมกะไบต์ โดยใช้งานทั้งหมดใน parLapply

การเขียนโปรแกรมแบบขนานใน R

การแบ่ง chunk ด้วย parallel

cl <- makeCluster(4)
ls_df <- parLapply(cl, ls_files, read.csv,

chunk.size = 26)
stopCluster(cl)

การอ่านไฟล์ CSV แบบขนานด้วย parLapply ใช้หน่วยความจำเพียง 1 เมกะไบต์ เมื่อกำหนด chunk size เป็น 26

การเขียนโปรแกรมแบบขนานใน R

ควรแบ่ง chunk เมื่อใด?

  • การแบ่ง chunk จะทำงานได้ดีที่สุดโดยค่าเริ่มต้น
  • เมื่อมีข้อมูลขนาดใหญ่และหน่วยความจำเริ่มไม่เพียงพอ
    • ลองลดจำนวน core ลงหากทำได้
    • ทดลองปรับ chunk size หลายค่าเพื่อหาจุดที่เหมาะสม
การเขียนโปรแกรมแบบขนานใน R

มาฝึกกันเถอะ!

การเขียนโปรแกรมแบบขนานใน R

Preparing Video For Download...