我遇到一种情况,我需要获取一个流并将其分块到Buffers中。我计划编写一个对象转换流,该流接受常规的输入数据,并输出Buffer对象(其中的缓冲区大小均相同)。也就是说,如果将我的分块器转换配置为8KB,并且将4KB写入其中,它将在输出8KB Buffer实例之前等待,直到写入了另外的4KB。

我可以选择缓冲区的大小,只要它在8KB到32KB范围内即可。是否有最佳尺寸可供选择?我很好奇的原因是the Node.js documentation speaks of using SlowBuffer支持Buffer,并至少分配了8KB:



这是否意味着8KB是有效的大小,如果我使用12KB,将分配两个8KB SlowBuffers吗?还是仅表示最小有效大小为8KB?仅仅使用8KB的倍数怎么办?还是根本没有关系?

最佳答案

基本上是说,如果您的Buffer小于8KB,它将尝试使其适合预先分配的8KB内存块。它将继续将Buffer放入该8KB块中,直到不合适为止,然后它将分配一个新的8KB块。如果Buffer大于8KB,它将获得自己的内存分配。

您实际上可以通过查看缓冲区here的 Node 源来了解正在发生的情况:

if (this.length <= (Buffer.poolSize >>> 1) && this.length > 0) {
  if (this.length > poolSize - poolOffset)
    createPool();
  this.parent = sliceOnto(allocPool,
                          this,
                          poolOffset,
                          poolOffset + this.length);
  poolOffset += this.length;
} else {
  alloc(this, this.length);
}

看着它,实际上看起来只有将Buffer小于或等于4KB(Buffer.poolSize >>> 1,即4096时为Buffer.poolSize = 8 * 1024)放入预先分配的块中。

至于适合您的情况的最佳尺寸,我认为这取决于您最终使用它的目的。但是,总的来说,如果您想要一个小于或等于8KB的块,我会选择小于或等于4KB的东西,这些东西将均匀地适合于8KB的预分配(4KB,2KB,1KB等)。否则,大于8KB的块大小不会有太大的区别。

10-04 15:33