【发布时间】:2014-02-17 13:41:41
【问题描述】:
当我在 Node.js 中执行 fs.createReadStream 时,数据似乎以 64KB 块的形式出现(我假设这在计算机之间有所不同)。
假设我通过一系列转换(每个转换对单个块进行操作)传输读取流,然后最终将其传输到写入流以将其保存到磁盘...
如果我事先知道我正在处理的文件每个都保证小于 64KB(即,它们每个都将在一个块中读取),那么使用流有什么好处,而不是普通的旧异步代码?
【问题讨论】:
当我在 Node.js 中执行 fs.createReadStream 时,数据似乎以 64KB 块的形式出现(我假设这在计算机之间有所不同)。
假设我通过一系列转换(每个转换对单个块进行操作)传输读取流,然后最终将其传输到写入流以将其保存到磁盘...
如果我事先知道我正在处理的文件每个都保证小于 64KB(即,它们每个都将在一个块中读取),那么使用流有什么好处,而不是普通的旧异步代码?
【问题讨论】:
首先,您可以使用the highWaterMark parameter 配置块大小:字节模式流默认为16k(对象模式流为16 个对象),但fs.ReadStream 默认为64k 块(参见relevant source code )。
如果您绝对确定您的所有数据都适合一个块,那么使用流确实没有直接的好处。
但请记住,流是灵活的;它们是代码的统一抽象:您可以从文件、套接字或随机生成器中读取数据。您可以在流管道中添加或删除双工流,您的代码仍将以相同的方式工作。
您还可以将单个可读流通过管道传输到多个可写流中,但仅使用异步回调会很痛苦……
另请注意,流不会同步发出数据(即,readable 事件在下一个滴答时发出),它可以很好地为您处理同步调用异步回调的常见错误,从而产生可能的堆栈溢出错误.
【讨论】: