7 คะแนน โดย xguru 2020-07-24 | 2 ความคิดเห็น | แชร์ทาง WhatsApp
  • ใช้แทน 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 ความคิดเห็น

 
kbumsik 2020-07-24

โห จะมีเหตุผลให้ต้องใช้ Map ที่ใหญ่ขนาดนั้นด้วยเหรอ

 
xguru 2020-07-24

ในความเป็นจริง หากใส่คีย์มากกว่า 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