NodeJS的ReadStream为什么不能每次读取bufferSize个字节?

6

我有一段代码,NodeJS服务器读取文件并将其流式传输到响应中,代码如下:

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

问题是,Node 一次读取文件恰好是 40960 字节。然而,我的应用程序如果一次读取 131072 (128 * 1024) 字节会更高效(由于本问题不适用的原因)。是否有一种方法可以强制 Node 每次读取 128 * 1024 字节?
2个回答

13

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

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

文档明确指出:'可能缓冲的数据量取决于传递到流构造函数中的highWaterMark选项。对于普通流,highWaterMark选项指定了总字节数。对于以对象模式操作的流,高水位线指定了对象总数。'

此外,请参见此处。默认的缓冲区大小为64千字节。


0

我是新来的,所以请多包涵……

我在 Node 的源代码中找到了这个:

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

并且:

var kPoolSize = 40 * 1024;

看起来缓冲区大小被限制在40kb,无论你提供什么。你可以尝试在代码中更改该值并重新构建节点。但这可能不是一个非常可维护的解决方案...


这是正确的。我将值编辑为128 * 1024并重新构建了节点。它仍然不能完成工作,但仍然比以前好。通常每次读取大约128000字节,然后在下一次读取中读取剩余的平衡(128k - ~128000)。这有点奇怪。 - Tarandeep Gill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接