NODEJS:可写入stream上的Uncork()方法并不真正刷新数据

我正在编写相当简单的应用程序来转换数据 – 读取一个文件并写入另一个文件。 文件相对较大 – 2 GB。 不过,我发现在软木塞的循环中刷新文件系统并没有发生,只发生在end()上,所以end()基本上挂起了系统,直到完全刷新为止。 我简化了这个例子,所以它只是写了一个很多次的stream。

var PREFIX = 'E:\\TEST\\'; var line = 'AA 11 999999999 20160101 123456 20160101 AAA 00 00 00 0 0 0 2 2 0 0 20160101 0 00'; var fileSystem = require('fs'); function writeStrings() { var stringsCount = 0; var stream = fileSystem.createWriteStream(PREFIX +'output.txt'); stream.once('drain', function () { console.log("drained"); }); stream.once('open', function (fileDescriptor) { var started = false; console.log('writing file '); stream.cork(); for (i = 0; i < 2000000; i++) { stream.write(line + i); if (i % 10000 == 0) { // console.log('passed ',i); } if (i % 100000 == 0) { console.log('uncorcked ',i,stream._writableState.writing); stream.uncork(); stream.cork(); } } stream.end(); }); stream.once('finish', function () { console.log("done"); }); } writeStrings(); 

进入节点_stream_writable.js,我发现它只在这种情况下刷新缓冲区:

  if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.buffer.length) clearBuffer(this, state); 

而且,从示例中可以看出,写入标志在第一个uncork()之后不会回退,从而防止uncork刷新。 另外,我看不出排水事件。 用highWaterMark玩并没有帮助(实际上似乎没有任何影响)。 手动设置为false(+一些其他标志)的写作的确有帮助,但这肯定是错误的。 我误解了这个概念吗?

从node.js文档中,我发现uncork()的数目应该与cork()调用的数目相匹配,我没有看到与for循环之前调用的stream.cork()相匹配的stream.uncork()调用。 这可能是问题。