我遇到一种情况,我需要获取一个流并将其分块到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的块大小不会有太大的区别。