【问题标题】:NodeJS ReadStream not reading bufferSize bytes at a timeNodeJS ReadStream一次不读取bufferSize字节
【发布时间】:2012-07-31 19:41:25
【问题描述】:

我有一个代码,NodeJS 服务器读取文件并将其流式传输到响应,它看起来像:

var fStream = fs.createReadStream(filePath, {'bufferSize': 128 * 1024});
fStream.pipe(response);

问题是,Node 一次准确地读取文件 40960 个字节。但是,如果我的应用一次读取 131072 (128 * 1024) 个字节,那么它的效率会更高(由于不适用于此问题的原因)。

有没有办法强制 Node 一次读取 128 * 1024 字节?

【问题讨论】:

    标签: node.js stream buffer


    【解决方案1】:

    我是新来的,所以请耐心等待......

    我在节点的来源中找到了这个:

    var toRead = Math.min(pool.length - pool.used, ~~this.bufferSize);
    

    和:

    var kPoolSize = 40 * 1024;
    

    因此,无论您提供什么,似乎缓冲区大小都被限制为 40kb。您可以尝试更改代码中的值并重建节点。不过,这可能不是一个非常可维护的解决方案......

    【讨论】:

    • 这是对的。我将值编辑为 128 * 1024 并重建了节点。它仍然没有完成这项工作,但它仍然更好。它通常在一次读取中读取大约 128000 字节,然后在下一次读取中读取剩余余额(128k - ~128000)。这有点奇怪。
    【解决方案2】:

    接受的答案是错误的。您可以使用 highWaterMark 选项强制 Node 一次读取 (128*1024) 个字节。

    var fStream = fs.createReadStream('/foo/bar', { highWaterMark: 128 * 1024 });

    Documentation 明确指出 '可能缓冲的数据量取决于传递给流构造函数的 highWaterMark 选项。对于普通流,highWaterMark 选项指定总字节数。对于在对象模式下运行的流,highWaterMark 指定对象的总数。'

    另外,请参阅this。默认缓冲区大小为 64 KiloBytes

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      • 2010-10-30
      相关资源
      最近更新 更多