2011-06-24 2 views
3

J'écris une application node.js qui stdout est redirigée vers un fichier. J'écris tout avec console.log. Après un certain temps, mon application atteint la limite de 1 Go et s'arrête. Ce qui est intéressant, c'est que si j'utilise console.error au lieu de console.log, l'utilisation de la mémoire reste faible et le programme fonctionne correctement. Il semble donc que node.js ne peut pas vider le flux stdout et tout est conservé en mémoire. Je veux garder stderr libre pour les erreurs.Comment écrire du blocage dans stdout avec node.js?

Ma question est:

Est-il possible d'écrire dans le blocage stdout? Ou au moins, puis-je écrire avec un rappel sur stdout, donc je peux m'assurer que je n'écris pas trop?

thx!

Répondre

10

Si vous voulez vraiment vraiment l'écriture synchrone pour vous stdout pouvez faire:

var fs = require('fs'); 
fs.writeSync(1, "Foo\n"); 
fs.fsyncSync(1); 
+0

Voilà une excellente solution! Mais à quoi sert fs.fsyncSync (1)? – user698601

+1

user698601: Assurez-vous que tout a été écrit dans le fichier descripteur un. L'un est stdout, deux est stderr, trois est stdin. – thejh

1

Ne le faites pas.

Qu'est-ce que vous voulez faire est pause() votre entrée lorsque la sortie est pleine, comme la méthode pump() fait, puis resume() quand vous avez l'espace pour écrire. Sinon, votre processus gonfle à la taille gargantuesque.

Vous souhaitez probablement utiliser les éléments plus directs outputStream pour cela, cependant, ou l'appel write(), pas console.log().

5

Écrivez en utilisant process.stdout.write, la valeur de retour est de savoir si les données ont été mises en mémoire tampon. Si c'est le cas, continuez à écrire lorsque process.stdout émet l'événement drain.

Si vous voulez que votre code pour regarder la synchronisation, utilisez streamlinejs comme décrit ici: Node.js stdout flush

Questions connexes