用nodejsstream来压缩文件导致内存泄漏

我试图做一些看起来很简单的事情:用一个文件名为X的文件,并创build一个gzip版本为“X.gz”。 Nodejs的zlib模块没有提供方便的zlib.gzip(infile,outfile),所以我想我会使用一个inputstream,一个输出stream和一个zlib gzipper,然后pipe它们:

var zlib = require("zlib"), zipper = zlib.createGzip(), fs = require("fs"); var tryThing = function(logfile) { var input = fs.createReadStream(logfile, {autoClose: true}), output = fs.createWriteStream(logfile + ".gz"); input.pipe(zipper).pipe(output); output.on("end", function() { // delete original file, it is no longer needed fs.unlink(logfile); // clear listeners zipper.removeAllListeners(); input.removeAllListeners(); }); } 

然而,每次运行这个函数,Node.js的内存占用量都会增长100kb左右。 我忘了告诉溪stream,他们应该再次自杀,因为他们不再需要了吗?

或者,有没有办法只是gzip文件,而不打扰stream和pipe道? 我尝试使用“node.js gzip一个文件”的search引擎,但它只是链接到API文档,堆栈溢出问题的gzippingstream和缓冲区,而不是如何只是gzip文件。

我认为你需要适当的unpipeclosestream。 只需removeAllListeners()可能不足以清理所有东西。 由于stream可能正在等待更多的数据(并因此不必要地保持在内存中)。

另外,你还没有closures输出stream,IMO我会听inputstream的end而不是输出。

 // cleanup input.once('end', function() { zipper.removeAllListeners(); zipper.close(); zipper = null; input.removeAllListeners(); input.close(); input = null; output.removeAllListeners(); output.close(); output = null; }); 

另外我不认为从zlib.createGzip()返回的stream可以共享一次结束。 你应该在tryThing每一次迭代中创build一个新的:

 var input = fs.createReadStream(logfile, {autoClose: true}), output = fs.createWriteStream(logfile + ".gz") zipper = zlib.createGzip(); input.pipe(zipper).pipe(output); 

没有testing过这个tho,因为我现在没有附近的内存configuration文件工具。