2018 年,谷歌的一位技术主管表示,他们正在努力在 64 位系统上的 V8 中“支持超过 4GiB 的缓冲区”。那发生了吗?
尝试将大文件加载到缓冲区中,例如:
const fileBuffer = fs.readFileSync(csvPath);
Run Code Online (Sandbox Code Playgroud)
在 Node v12.16.1 中并收到错误:
RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3461193224) is greater than possible Buffer: 2147483647 bytes.
Run Code Online (Sandbox Code Playgroud)
在 Node v14.12.0(最新)中并得到错误:
RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3461193224) is greater than 2 GB
Run Code Online (Sandbox Code Playgroud)
在我看来,这是由于用于缓冲区寻址的 32 位整数而设置的限制。但我不明白为什么这会成为 64 位系统的限制......是的,我意识到我可以使用流或从特定地址的文件中读取,但我有大量内存,而且我限制为 2147483647 字节,因为 Node 仅限于 32 位寻址?
当然,将高频随机访问数据集的缓冲区完全加载到缓冲区中而不是流式处理具有性能优势。指导请求从多缓冲区替代结构中提取的代码将花费一些成本,无论多小......
我可以使用该--max-old-space-size=16000标志来增加 Node 使用的最大内存,但我怀疑这是基于 V8 架构的硬限制。但是我仍然要问,因为 Google 的技术负责人确实声称他们将最大缓冲区大小增加到 4GiB 以上:2020 年有什么办法可以让 Node.js 中的缓冲区超过 2147483647 字节?
编辑,谷歌关于该主题的相关跟踪器,显然他们至少从去年开始就在努力解决这个问题:https : //bugs.chromium.org/p/v8/issues/detail?id=4153
那发生了吗?
是的,V8 现在支持非常大(很多 GB)的 ArrayBuffers。
有没有办法在 Node.js 中拥有超过 2147483647 字节的缓冲区?
是的:
$ node
Welcome to Node.js v14.12.0.
Type ".help" for more information.
> let b = Buffer.alloc(3461193224)
undefined
> b.length
3461193224
Run Code Online (Sandbox Code Playgroud)
也就是说,它似乎fs.readFileAsync有它自己的限制:https : //github.com/nodejs/node/blob/master/lib/internal/fs/promises.js#L5
我不知道需要什么来解除它。我建议您在 Node 的错误跟踪器上提交问题。
FWIW,Buffer还有另一个限制:
> let buffer = require("buffer")
undefined
> buffer.kMaxLength
4294967295
Run Code Online (Sandbox Code Playgroud)
再说一次,这是 Node 的决定,而不是 V8 的决定。
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |