node.js - Node JS : Uncork() method on writable stream doesn't really flush the data

标签 node.js node.js-stream

我正在编写非常简单的应用程序来转换数据 - 读取一个文件并写入另一个文件。文件相对较大 - 2 GB。然而,我发现刷新到文件系统并没有发生,在软木塞-开塞循环中,它只发生在 end() 上,所以 end() 基本上挂起系统,直到它完全刷新。 我简化了示例,因此它只是多次向流中写入一行。

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();

进入 Node _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()调用的数量相匹配,我没有看到stream.cork()的匹配的stream.uncork()调用,它在for循环之前调用。这可能就是问题所在。

关于node.js - Node JS : Uncork() method on writable stream doesn't really flush the data,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34902602/

相关文章:

json - 如何使用 node.js 通过 mqtt 发布从 URL 接收的实时流式 json 数据

Node.js - 错误 : write EPIPE code: 'EPIPE

node.js - 如何将 websocket 二进制消息作为流发送到 Google Speech API?

javascript - Async/await 未按预期顺序执行

javascript - V8 垃圾回收会释放内存吗?

Node.js PassThrough 流没有正确关闭?

javascript - 从 Postgres 读取 float 而不四舍五入

javascript - 如何在 Electron Framework 中使用登录事件?

node.js - 使用 websocket Node 将命令流式传输到 python shell

node.js - 从管道 HTTP 流中删除 header