- สรุปความพยายามต่าง ๆ ที่ลองทำเพื่อสร้างฐานข้อมูลทดสอบขนาดใหญ่ได้อย่างรวดเร็ว
→ ตอนนี้สถิติที่ดีที่สุดอยู่ที่ 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 แล้วสร้างตามฟอร์แมตโดยตรงเอง
ยังไม่มีความคิดเห็น