• สรุปความพยายามต่าง ๆ ที่ลองทำเพื่อสร้างฐานข้อมูลทดสอบขนาดใหญ่ได้อย่างรวดเร็ว

→ ตอนนี้สถิติที่ดีที่สุดอยู่ที่ 100 ล้านแถวใน 33 วินาที (อ้างอิงจาก MBP 2019)

  • วนลูปด้วยโค้ด Python: 10 ล้านแถวใช้เวลา 15 นาที

→ ปรับขนาด batch insert เป็น 100,000: ลดเหลือ 10 นาที

  • ปรับแต่งค่า SQLite: ปิด journal_mode/synchronous, ปรับ cache size, ใช้ exclusive lock

→ เวอร์ชันลูป 100 ล้านแถวใช้เวลา 10 นาที, เวอร์ชัน batch ใช้เวลา 8.5 นาที

  • เปลี่ยนไปใช้ PyPy: เวอร์ชัน batch ลดเหลือ 2.5 นาทีสำหรับ 100 ล้านแถว (เร็วขึ้น 3.5 เท่า)

  • เขียนด้วย Rust: เวอร์ชันลูป + การปรับแต่ง SQLite ใช้เวลา 3 นาทีสำหรับ 100 ล้านแถว

→ เปลี่ยนเป็น Prepared Statement และทำ batch insert ครั้งละ 50 แถว ได้ 34.3 วินาทีสำหรับ 100 ล้านแถว

→ เปลี่ยนเป็นเวอร์ชันหลายเธรด: เธรด Writer 1 ตัว, เธรดข้อมูล 4 ตัว ได้ 32.37 วินาที

  • เปลี่ยนที่เก็บฐานข้อมูล SQLite เป็น :memory: ทำให้ลดลงอีก 2 วินาที เหลือ 29 วินาที

→ ดูเหมือนว่าการ flush 100 ล้านแถวใช้เวลา 2 วินาที

  • สิ่งที่จะลองต่อไป (เพื่อไปให้ถึง 1 พันล้านแถวใน 1 นาที)

→ ลองทำ profiling

→ ลองใช้เวอร์ชันหลายโปรเซสเพื่อใช้ 4 คอร์

→ เขียนด้วยภาษา Go แล้วปิด GC ก่อนรัน

→ ไอเดียบ้าคลั่ง: เรียนรู้ฟอร์แมตไฟล์ SQLite แล้วสร้างตามฟอร์แมตโดยตรงเอง

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น