forach/doParallel บทความสั้นบอกว่า (เป็นโค้ดที่เล็กกว่าของคุณมาก):
โปรดทราบว่านี่ไม่ใช่การใช้งาน doParallel ในทางปฏิบัติ นี่คือโปรแกรม “Hello, world” ของเราสำหรับการประมวลผลแบบขนาน จะทดสอบว่าทุกอย่างได้รับการติดตั้งและตั้งค่าอย่างถูกต้อง แต่อย่าคาดหวังว่ามันจะทำงานเร็วกว่าลำดับ for loop เพราะมันจะไม่เป็นเช่นนั้น! sqrt ดำเนินการเร็วเกินไปจนคุ้มค่ากับการดำเนินการแบบคู่ขนาน แม้ว่าจะวนซ้ำหลายครั้งก็ตาม สำหรับงานขนาดเล็ก ค่าใช้จ่ายในการจัดกำหนดการงานและการส่งคืนผลลัพธ์อาจมากกว่าเวลาในการดำเนินการงานเอง ส่งผลให้ประสิทธิภาพการทำงานไม่ดี นอกจากนี้ ตัวอย่างนี้ไม่ได้ใช้ความสามารถเวกเตอร์ของ sqrt ซึ่งจะต้องได้รับประสิทธิภาพที่เหมาะสม นี่เป็นเพียงการทดสอบและตัวอย่างการสอน ไม่ใช่เกณฑ์มาตรฐาน
ดังนั้นโดยธรรมชาติแล้วการตั้งค่าของคุณอาจไม่เร็วขึ้น
ให้ลองโดยไม่ขนานกัน แต่ใช้ vectorization:
q <- sapply(1:1e6, function(x) 1 + 1 )
มันทำเช่นเดียวกันกับลูปตัวอย่างของคุณทุกประการและเสร็จสิ้นในไม่กี่วินาที ทีนี้ลองสิ่งนี้ (มันยังคงทำสิ่งเดียวกันที่แน่นอนในเวลาเดียวกัน:
x <- rep(1, n=1e6)
r <- x + 1
มันเพิ่มเป็น 1e6 1
s a 1
ทันที (พลังของการทำให้เวกเตอร์ ... )
การรวมกันของ foreach
กับ doParallel
นั้นมาจากประสบการณ์ส่วนตัวของฉันช้ากว่าถ้าคุณใช้แพ็คเกจชีวสารสนเทศศาสตร์ BiocParallel
จากที่เก็บ Bioconda (ฉันเป็นนักชีวสารสนเทศและในวิชาชีวสารสนเทศศาสตร์ เรามักจะมีสิ่งที่ต้องใช้การคำนวณหนักมาก เนื่องจากเรามีไฟล์ข้อมูลเดียวขนาดหลายกิกะไบต์ที่ต้องประมวลผล และหลายไฟล์ในนั้น) ฉันลองใช้ฟังก์ชันของคุณโดยใช้ BiocParallel
และใช้ CPU ที่กำหนดทั้งหมด 100% (ทดสอบโดยการรัน htop
ระหว่างการปฏิบัติงาน) ทั้งหมดใช้เวลา 17 วินาที
แน่นอน - ด้วยตัวอย่างแบบ Lightweight ของคุณ สิ่งนี้ใช้ได้กับ:
ค่าใช้จ่ายในการจัดกำหนดการงานและการส่งคืนผลลัพธ์อาจมากกว่าเวลาในการดำเนินการงานนั้นเอง
อย่างไรก็ตาม ดูเหมือนว่าจะใช้ CPU อย่างละเอียดมากกว่า doParallel
ดังนั้น ใช้สิ่งนี้ หากคุณมีงานการคำนวณหนักที่ต้องทำ นี่คือรหัสที่ฉันทำ:
# For bioconductor packages, the best is to install this:
install.packages("BiocManager")
# Then activate the installer
require(BiocManager)
# Now, with the `install()` function in this package, you can install
# conveniently Bioconductor packages like `BiocParallel`
install("BiocParallel")
# then, activate it
require(BiocParallel)
# initiate cores:
bpparam <- bpparam <- SnowParam(workers=4, type="SOCK") # 4 or take more CPUs
# prepare the function you want to parallelize
FUN <- function(x) { 1 + 1 }
# and now you can call the function using `bplapply()`
# the loop parallelizing function in BiocParallel.
s <- bplapply(1:1e6, FUN, BPPARAM=bpparam) # each value of 1:1e6 is given to
# FUN, note you have to pass the SOCK cluster (bpparam) for the
# parallelization
ดูข้อมูลเพิ่มเติมได้ที่ บทความสั้นของแพ็คเกจ BiocParallel. ดูที่ตัวนำชีวภาพว่ามีบรรจุภัณฑ์จำนวนเท่าใดและมีเอกสารประกอบอย่างดี ฉันหวังว่านี่จะช่วยคุณในเรื่องการประมวลผลแบบขนานในอนาคต
person
Gwang-Jin Kim
schedule
11.10.2018
future.apply
ได้ คุณตั้งค่าโดยใช้library(future.apply); plan(multiprocess(workers = 3))
จากนั้นคุณสามารถดำเนินการฟังก์ชันของคุณด้วย:future_sapply(X = 1:1e6, FUN = function(x) {1 + 1})
- person bschneidr   schedule 12.10.2018