7 Punkte von xguru 2020-07-24 | 2 Kommentare | Auf WhatsApp teilen
  • Ersatz für ES6 Maps mit einer Begrenzung von 16 Millionen: Es können mehr als 1 Milliarde Schlüssel gespeichert werden

  • In C++ entwickelt und mit einem Wrapper für Node.js ausgestattet

→ 500.000 Schlüssel-Lese-/Schreibvorgänge pro Sekunde möglich

→ Geringer Memory-Overhead

→ Wird nicht im V8-Heap gespeichert

→ Unterstützt Buffer, Strings, Zahlen, Booleans und Objekte

  • Grundsätzlich kompatibel mit der ES6-Map-API: get, set, has, ddelete, clear, length

  • Verwendet intern das Separate-Chaining-Verfahren: Index + Linked-List-Methode

2 Kommentare

 
kbumsik 2020-07-24

Huch, gibt es wirklich einen Grund, eine so große Map zu verwenden? hm

 
xguru 2020-07-24

Tatsächlich tritt in Node.JS ein Heap-Fehler auf, wenn man mehr als 2^24 Schlüssel in eine Map einfügt.

Das ist kein Bug, sondern eine in der Implementierung definierte Begrenzung; eine Antwort eines V8-Entwicklers dazu gibt es auf StackOverflow.

https://stackoverflow.com/a/54466812/166418

  • Das FixedArray, das die Map speichert, hat eine maximale Größe von 1 GB

  • Auf 64-Bit-Systemen gilt 1 GB / 8 B = 2^30 / 2^3 = 2^27 ~= 134 M, daher kann das FixedArray maximal 134 Millionen Elemente speichern

  • Eine Map benötigt 3 Elemente pro Eintrag (Key, value, next bucket link), und die maximale Auslastung ist auf 50 % begrenzt, um Bucket-Kollisionen zu vermeiden.

→ Da die Kapazität eine Zweierpotenz sein muss, ist beim Rechnen mit 2^27 / (3 * 2) und anschließendem Abrunden auf die nächste Zweierpotenz 2^24 der Maximalwert