-
ใช้แทน ES6 Maps ที่มีข้อจำกัดอยู่ที่ 16 ล้านรายการ: สามารถเก็บคีย์ได้มากกว่า 1 พันล้านคีย์
-
พัฒนาด้วย C++ และมี Wrapper สำหรับ Node.js
→ อ่าน/เขียนคีย์ได้ 500,000 รายการต่อวินาที
→ มี memory overhead ต่ำ
→ ไม่ถูกเก็บไว้ใน V8 Heap
→ รองรับ Buffer, สตริง, ตัวเลข, บูลีน, อ็อบเจ็กต์
-
เข้ากันได้กับ ES6 Map API เป็นหลัก: get, set, has, ddelete, clear, length
-
ภายในใช้เทคนิค Separate Chaining: โครงสร้างแบบดัชนี + linked list
2 ความคิดเห็น
โห จะมีเหตุผลให้ต้องใช้ Map ที่ใหญ่ขนาดนั้นด้วยเหรอ
ในความเป็นจริง หากใส่คีย์มากกว่า 2^24 รายการลงใน Map ของ Node.JS จะเกิด heap error
นี่ไม่ใช่บั๊ก แต่เป็นข้อจำกัดที่กำหนดไว้ในการติดตั้งใช้งาน และมีคำตอบจากนักพัฒนา V8 เกี่ยวกับเรื่องนี้อยู่ใน StackOverflow
https://stackoverflow.com/a/54466812/166418
FixedArray ที่ใช้เก็บ Map มีขนาดสูงสุด 1GB
บนระบบ 64 บิต 1GB / 8B = 2^30 / 2^3 = 2^27 ~= 134M ดังนั้น FixedArray จึงเก็บอิลิเมนต์ได้สูงสุด 134 ล้านรายการ
Map ต้องใช้อิลิเมนต์ 3 ตัวต่อหนึ่งเอนทรี (Key, value, next bucket link) และจำนวนที่บรรจุได้สูงสุดถูกจำกัดไว้ที่ 50% เพื่อหลีกเลี่ยง bucket collision
→ เนื่องจากความจุต้องเป็นกำลังสอง เมื่อนำ 2^27 / (3 * 2) แล้วปัดลงเป็นกำลังสองถัดไป ค่าสูงสุดจึงเป็น 2^24