web-dev-qa-db-fra.com

nodejs manque de mémoire

J'ai rencontré un curieux problème aujourd'hui. Cela peut être une réponse facile pour les autres, mais cela me laisse perplexe. Pourquoi le code ci-dessous provoque-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

J'obtiens l'une de ces deux erreurs ... la première lorsque j'exécute ce code dans l'interpréteur de noeud et la seconde lorsque je l'exécute via nodeunit:

ERREUR FATALE: Échec de l'allocation CALL_AND_RETRY_2 - processus hors de la mémoire

ERREUR FATALE: Échec de l'allocation JS - mémoire insuffisante

29
Sneaky Wombat

Cela se produit lorsque j'essaie d'accéder au tableau. Mais ce n'est pas le cas.

> 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 SO question, limite de mémoire dans Node.js (et chrome V8) qui concerne le problème d'utilisation de la mémoire.

7
ace

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

L'exemple permettra au tas du nœud d'utiliser jusqu'à 4 Go (4096 mégaoctets) de mémoire:

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

Je ne reçois pas d'erreur d'allocation de mémoire lorsque j'exécute votre script. Combien RAM est sur votre système?

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

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

4
Geuis