2018年,谷歌( Google 表示他们正在努力在64位系统上“支持V8中的4 4GiB以外的缓冲区”。 )的技术领先。这事发生了吗?
试图将大型文件加载到缓冲区中,如:
const fileBuffer = fs.readFileSync(csvPath);在Node v12.16.1中获得错误:
RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3461193224) is greater than possible Buffer: 2147483647 bytes.在Node v14.12.0 (最新)中,获取错误:
RangeError [ERR_FS_FILE_TOO_LARGE]: File size (3461193224) is greater than 2 GB在我看来,这是一个限制设置,因为32位整数用于寻址缓冲区。但我不明白为什么这会限制64位系统..。是的,我意识到我可以在一个特定的地址使用流或从文件中读取,但我有大量的内存,而且我被限制在2147483647字节,因为节点被限制在32位寻址?
当然,将一个高频随机访问数据集的缓冲区完全加载到一个缓冲区中而不是流中具有性能上的好处。指示从多个缓冲区替代结构中提取请求所涉及的代码将花费一些费用,而不管其大小.
我可以使用--max-old-space-size=16000标志来增加Node使用的最大内存,但我怀疑这是一个基于V8体系结构的硬限制。不过,我还是要问,因为Google的技术领军者确实声称他们正在将最大缓冲容量增加到超过4GiB:有任何办法在2020年在Node.js?中拥有超过2147483647字节的缓冲区吗?
编辑,相关跟踪器的主题由谷歌,其中很明显,他们至少在去年就在努力解决这个问题。:https://bugs.chromium.org/p/v8/issues/detail?id=4153
发布于 2020-09-25 01:22:10
这事发生了吗?
是的,V8现在支持非常大的(很多千兆字节) 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尽管如此,fs.readFileAsync似乎有它自己的限制:https://github.com/nodejs/node/blob/master/lib/internal/fs/promises.js#L5,我不知道要用什么来提升它。我建议你在Node的bug追踪器上找个问题。
Buffer还有另一个限制:
> let buffer = require("buffer")
undefined
> buffer.kMaxLength
4294967295再说一次,这是Node的决定,不是V8的决定。
https://stackoverflow.com/questions/64056286
复制相似问题