Nœud hors mémoire

J'ai rencontré un problème curieux aujourd'hui. C'est peut-être une réponse facile pour les autres, mais ça m'a fait perplexe. Pourquoi le code ci-dessous cause-t-il une erreur de mémoire?

var cur = 167772160; var bcast = 184549375; var addresses = []; while (cur <= bcast){ cur += 1; addresses.push(cur); } addresses.length addresses // memory goes from a few megs to over a gig in seconds when trying to print this 

Je reçois une de ces deux erreurs … la première lorsque je lance ce code dans l'interpréteur de nœud et le dernier lorsque je l'exécute via nodeunit:

ERREUR FATAL: CALL_AND_RETRY_2 Affectation échouée – processus hors mémoire

FATAL ERROR: JS Allocation a échoué – processus hors mémoire

Cela arrive quand j'essaie d'accéder au tableau. Mais l'obtention de la longueur ne l'est pas.

 > var cur = 167772160; > var bcast = 184549375; > var addresses = []; > while (cur <= bcast){ ... cur += 1; ... addresses.push(cur); ... } 16777216 > addresses.length 16777216 > addresses FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 

Voici une autre question SO, limite de mémoire dans Node.js (et chrome V8) qui concerne un problème avec l'utilisation de la mémoire.

Vous pouvez augmenter les limites par défaut en passant --max-old-space-size=<value> qui est en MB.

L'exemple permettra à la pile de nœud d'utiliser jusqu'à 4 Go (4096 méga-octets ) de mémoire:

 node --max-old-space-size=4096 app 

Je n'obtiens pas une erreur d'allocation de mémoire lorsque je lance votre script. Combien de RAM est sur votre système?

Edit Ok avec les notes mises à jour de l'auteur, je peux le reproduire.

Node essaie de convertir votre tableau entier en une chaîne. Le tableau est de 16777216 éléments. Chaque élément contient un nombre d'au moins 9 chiffres. Conversion à une chaîne de 150 994 994 caractères. C'est juste une opération énorme qui dépasse les capacités de mémoire du noeud.