推荐的方法来增加缓冲区?

Kev*_*rke 5 javascript buffer node.js

假设我要在Node中构造一个可变长度的字符串或一系列字节。buf.write的文档说:

https://nodejs.org/api/buffer.html#buffer_buf_write_string_offset_length_encoding

根据编码中的字符编码,将字符串以偏移量写入buf。length参数是要写入的字节数。如果buf没有足够的空间来容纳整个字符串,则仅写入一部分字符串。但是,不会写入部分编码的字符。

假设我要写入的数据超出了缓冲区的空间。推荐的生长方式是什么?似乎没有.grow方法或类似方法。我可以打电话Buffer.from(buf)来创建一个新的缓冲区,但这似乎效率很低。

Nik*_*kin 6

如果您在每次添加后不需要整个缓冲区的所有内容,我认为您可以在此处使用一组块(缓冲区)并Buffer.concat(chunks)在必要时构建整个缓冲区。

const chunks = [];

chunks.push(Buffer.from([0xE2, 0xAD, 0x90]));  // star
chunks.push(Buffer.from([0xF0, 0x9F, 0x9A, 0x80])); // rocket

const buf = Buffer.concat(chunks);

console.log(buf.toString()); 
Run Code Online (Sandbox Code Playgroud)


pba*_*aga 5

当一开始不知道最终大小时,您可以使用通常应用于动态数组的方法

  1. 分配Buffer一些初始大小
  2. Buffer只要有空间就写入内容
  3. 当下一段内容放不下时,创建一个Buffer双倍大小的新内容,将旧缓冲区的内容复制到新缓冲区,并将新内容像以前一样写到最后

这样在缓冲区末尾插入可以在O(1)分摊时间内执行。

这种方法的变体通常用于Java、.NET 或例如MemoryStream对应于 nodejs 的.NET 中的可调整大小的列表Buffer。您可以在此处查看MemoryStream是如何实现的。

尺寸不一定要翻倍。您可以选择不同的指数,例如3/2,如果您想节省一些空间。

当然,最好的方法是什么取决于您的用例,但这种方法总体上表现良好。