แบบว่า CPU เหลือ

เดี๋ยวนี้ (พ.ศ. ๒๕๕๙) คอมพิวเตอร์ของแต่ละคนก็มักจะมี CPU กันหลาย ๆ core ทีนี้พอเขียนโปรแกรมแบบเดิมก็อาจจะรู้สึกว่าใช้ไม่คุ้ม

สมมุติว่าไฟล์ชื่อ ja.txt เป็น text file ขนาดประมาณ 5 GiB ผมต้องการเอามานับว่ามีกลุ่มคำ 3 คำที่ติดกัน เช่น เจอ “กา|บิน|มา” ก็นับ 1 เจอ “นก|จิก|ปู” ก็นับ 1 เจอ “กา|บิน|มา” อีกทีก็นับเป็น 2 โดยที่การนับนี้มันก็ใช้พลัง CPU อยู่พอสมควร

ทั้งเครื่องก็มี CPU อยู่ 8 core ต้องการจะใช้ให้หมดจะทำอย่างไร
1. ใช้ Apache Hadoop และ Spark
2. เขียนโปรแกรมใหม่ด้วย Go และกระจายงานผ่าน Channel
3. ใช้ MPI
4. ใช้ pthread
อื่น ๆ

ท่าที่ว่ามันทั้งหมดมันก็ดีอยู่แต่ว่าใช้พลังมาก ผมก็เลยเขียน Ruby เหมือนเดิม แต่ใช้ GNU Parallel มาช่วย

เดิมที่สั่งงานแบบใช้ core เดียวทำแบบนี้ โดยที่ไฟล์ .kch คือไฟล์ database ของ KyotoCabinet ที่ใช้ hash table เก็บ

cat ja.txt | ruby ngram_kc.rb /mnt/data/ja.kch 

พอใช้ GNU Parallel ก็แค่แก้นิดหน่อย

cat ja.txt | parallel --pipe --block 500M 'ruby ngram_kc.rb /mnt/data/ja{#}.kch' 

แค่นี้มันก็จะส่ง text ไปนับแยกกันเลยเท่าจำนวน core ที่มีอยู่

แต่ประเด็นที่อาจจะมีปัญหาคือเราระบุไปว่า 500M มันจะไปหั่นไฟล์เราแบบ 500 MB พอดีแล้วไปตัดกลางคำพอดีหรือเปล่า คำตอบคือไม่ ใน man บอกทำนองว่า –block จะไม่ตัดผ่า record และจากที่อื่นก็ทราบอีกว่า 1 record โดยปริยายก็คือ 1 บรรทัด ก็คือไม่ตัดกลางบรรทัดแน่

พอสั่งแบบนี้เสร็จก็จะใช้ CPU ได้คุ้มขึ้นมาก และได้ไฟล์ ja1.kch ja2.kch ja3.kch … ทำให้มีงานงอกออกมานิดหน่อยคือต้องจับพวก hash table พวกนี้มา merge กัน ซึ่งผมจะละไว้ไม่เขียนถึงใน post นี้

Posted in ไม่มีหมวดหมู่Tagged

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s