วันอังคารที่ 2 เมษายน พ.ศ. 2562

การทดสอบเรื่องการใช้ Multiprocessing / Pool และ Queue

เบื้องต้นจะเป็นการทดสอบการเรียกฟังค์ชัน Image Processing จากรูป 1 รูป โดยแบ่งเป็น 2 กรณี

  1. ส่ง Input เป็นภาพเข้าไปในฟังค์ชัน Image Processing 
  2. ทำการ get ภาพจากภายในฟังค์ชันแทน

แบบ get ภาพจากในฟังค์ชัน 11 วินาที


แบบส่ง Input ภาพเข้าไปในฟังค์ชัน 3.7 วินาที

จะสังเกตได้ว่า ถึงแม้จะเป็นการใช้ 4 Process ในการเรียกฟังค์ชัน แต่การทำงานแบบป้อน Input เข้าฟังค์ชันนั้นจะทำให้ทำงานได้เร็วกว่าและใช้ CPU เต็มประสิทธิภาพกว่าแบบ get ภาพจากภายใจฟังค์ชัน


ทดสอบประสิทธิภาพของ Pool ในการ map function

การทดสอบขั้นต่อไปคือการแบ่งรูปภาพออกเป็น 4 ส่วน และทำการส่งเข้าไปประมวลผลโดยแบ่งเป็น 2 กรณีเช่นกัน คือ 
  1. map Input 4 รูปกับฟังค์ชัน Image Processing เดียว


  2. map Input 4 รูปกับฟังค์ชันที่ทำการ Group เอาไว้

ผลลัพธ์ที่ได้


การเปรียบเทียบโดยใช้ Graph



Single Image Processing Function



Group Image Processing Function

ประสิทธิภาพของการใช้ Queue ร่วมกับ Pool

ทำการเทียบประสิทธิภาพระหว่างการใช้ Queue ในการเก็บข้อมูลสำหรับใช้ระหว่าง Pool และแบบไม่ใช้ Queue ซึ่งจากปัญหาที่เคยพบก่อนหน้าคือ หากเราทำการส่ง Queue ผ่านการใช้ map ของ Pool โดยตรง จะทำให้เกิด Error


จึงได้ทำการแก้ไขโดย ปรับการประกาศใช้ Pool ใหม่ โดยเรียกแบบ Initializer จะทำให้สามารถส่ง Queue เข้าไปใช้ใน Pool ได้


การปรับวิธีเรียกใช้ Pool จากแบบปกติเป็น Initializer

ปัญหาที่พบต่อมาคือ ข้อมูลที่ถูกบันทึกลง Queue นั้นไม่ได้เรียงลำดับอย่างถูกต้องเนื่องจากการทำงานของตัว Process จะมองที่ว่าใครทำเสร็จก่อนก็บันทึกลง Queue ก่อน



จากภาพจะสังเกตได้ว่าตำแหน่งของภาพที่ 1 นั้นไม่ใช่ตำแหน่งที่ถูกต้องหาทำการ merge ภาพจะให้ข้อมูลที่ได้ไม่ถูกต้อง ทำการแก้ไขโดยใน array เก็บรูปให้เพิ่มค่า key ที่เป็นลำดับของภาพไว้ และใช้คำสั่ง Sort() หลังจากได้ผลสำเร็จจะทำให้ภาพกลับมาเรียงในตำแหน่งที่ถูกต้องอีกครั้ง


ผลลัพธ์ที่ได้


จากภาพจะพบว่าตำแหน่งของรูปนั้นอยู่ในลำดับที่ควรจะเป็นแล้ว


ผลลัพธ์จากการเทียบข้อมูลในกราฟพบว่าเวลาในการทำงานนั้นอยู่ในระดับที่ใกล้เคียงกัน


Pool without Queue


Pool with Queue

ไม่มีความคิดเห็น:

แสดงความคิดเห็น