2013-10-14 3 views
1

J'ai configuré un gist pour afficher l'utilisation de la mémoire au fil du temps d'un petit programme qui diffuse un fichier à partir du disque.nodejs fs semble gourmand

La mémoire allouée comme rss dans process.memoryUsage() ne descend jamais. D'autres projets, je sais qu'un autre fichier lu sera capable de réutiliser une partie de cette mémoire, mais cette mémoire n'est jamais libérée. Je sais que lorsque d'autres processus se contentent de mémoire, le système d'exploitation peut prendre une mémoire sous-utilisée et l'écrire pour l'échanger, mais ce n'est qu'une solution temporaire (et cela pourrait entraîner un échec de ma machine pour pas de bonne raison).

Étant donné que cette 'fuite' n'est pas dans le tas javascript, je ne pense pas vraiment que cela a à voir avec la façon dont je diffuse ce fichier, mais je voudrais une confirmation. Y a-t-il quelque chose que je suis censé faire pour que cette mémoire soit libérée?

$ node -v 
v0.10.20 
+0

Est-ce que c'est exactement le même fichier? –

+0

Le GIST est un exemple arbitraire où il diffuse un seul fichier, mais mes projets réels téléchargent et écrivent/lisent de nombreux fichiers. – PagodaJosh

+0

@PagodaJosh Ce n'est probablement pas si gourmand; le descripteur de fichier aurait dû être fermé (se lier à ''close'' pour savoir quand). Mais, le Garbage Collector dans V8 n'a probablement pas encore été exécuté pour libérer la mémoire utilisée par le flux. Pour moi, en streaming dans un fichier d'environ 330 Mo, l'utilisation de la mémoire diminue d'environ 45 à 50 secondes après '' end'' et '' close''. –

Répondre

0

j'ai eu un problème qui se résume à une testcase minimale très semblable à la vôtre - je l'ai fait sur la volée compression zip de fichiers dans un processus de serveur Web.

Pour le bien de gens qui trouvent ce fil - selon bnoordhuis sur the node.js bugreport you opened, vous devez appeler votre script avec les options--max_old_space_size=32 --expose_gc (adapter 32 Mo à ce que vous voulez), puis appel périodiquementgc(). Cela a aidé mon cas de test, et j'espère aussi ma demande.

La limite par défaut est de 1,5 Go. Très surprenant si vous voulez juste streamer quelques fichiers, plus de travail à faire sur le serveur, pas d'état à retenir, et vous avez utilisé node.js "pour l'efficacité" sur un petit serveur qui a beaucoup d'autres choses à faire.