การประมวลผลแบบขนานใน R

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

Nabeel Imam

Data Scientist

ตัวอย่างเชิงปฏิบัติ

ข้อมูล

print(file_list)
 [1] "./uni_data_country/Argentina.csv"
 [2] "./uni_data_country/Armenia.csv"
 [3] "./uni_data_country/Australia.csv"
 [4] "./uni_data_country/Austria.csv"
 [5] "./uni_data_country/Azerbaijan.csv"
 [6] "./uni_data_country/Bahrain.csv"
 [7] "./uni_data_country/Bangladesh.csv"
 [8] "./uni_data_country/Belarus.csv"
 [9] "./uni_data_country/Belgium.csv"
[10] "./uni_data_country/Bolivia.csv"
...

แสดงอาคารมหาวิทยาลัย 3 แห่งพร้อมนักศึกษาที่สำเร็จการศึกษา แต่ละแห่งได้รับการจัดอันดับตั้งแต่หนึ่งถึงสาม

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

เพิ่มคอลัมน์

for (file in file_list) {

  df <- read.csv(file)


df$top100 <- NA for (r in 1:nrow(df)) { df$top100[r] <- df$world_rank[r] <= 100 }
write.csv(df, file) }
การเขียนโปรแกรมแบบขนานใน R

การโปรไฟล์

โค้ด

library(profvis)


profvis({
for (file in file_list) { df <- read.csv(file) df$top100 <- NA for (r in 1:nrow(df)) { df$top100[r] <- df$Rank[r] <= 100 } write.csv(df, file) }
})

ผลลัพธ์

ผลลัพธ์การโปรไฟล์จาก profvis() จากโค้ดตัวอย่าง การอ่านข้อมูลใช้เวลา 40 มิลลิวินาที และการเติมค่าในคอลัมน์ `top100` ใช้เวลา 80 มิลลิวินาที ขั้นตอนอื่นๆ ใช้เวลาน้อยมาก

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

มาทำให้ขนานกัน

ลูป

  for (file in file_list) {

    df <- read.csv(file)
    df$top100 <- NA

    for (r in 1:nrow(df)) {
      df$top100[r] <- df$Rank[r] <= 100
    }
    write.csv(df, file)
  }

ฟังก์ชัน

add_col <- function(file_path) {

  df <- read.csv(file_path)
  df$top100 <- NA

  for (r in 1:nrow(df)) {
    df$top100[r] <- df$Rank[r] <= 100
  }
  write.csv(df, file_path)
}


cl <- makeCluster(6)
dummy <- parLapply(cl, file_list, add_col) stopCluster(cl)
การเขียนโปรแกรมแบบขนานใน R

ข้อควรพิจารณาเชิงปฏิบัติ: จำนวนคอร์

การตรวจจับจำนวนคอร์

detectCores()
[1] 8

โค้ดแบบขนาน

cl <- makeCluster(detectCores() - 2)


dummy <- parLapply(cl, file_list, add_col) stopCluster(cl)
การเขียนโปรแกรมแบบขนานใน R

ข้อควรพิจารณาเชิงปฏิบัติ: ประเภทคลัสเตอร์

PSOCK cluster (ค่าเริ่มต้น)

cl <- makeCluster(detectCores() - 2)
  • สร้างสำเนาของ R session ปัจจุบัน
  • คอร์ไม่แชร์หน่วยความจำ
  • ใช้ได้กับทุก OS (Windows, Mac, Linux)

FORK cluster

cl <- makeCluster(detectCores() - 2,
                  type = "FORK")
  • สร้าง subprocess จาก R session
  • คอร์แชร์หน่วยความจำ (เร็วกว่า PSOCK)
  • ไม่รองรับ Windows
การเขียนโปรแกรมแบบขนานใน R

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

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

Preparing Video For Download...