6

我在这里有点困惑。ArrayBuffer 是否为它分配一个新的内存区域?如果是这样,放置它的安全最大 Blob 大小是多少?

4

5 回答 5

7

这仅取决于您的系统,似乎没有限制。

根据规范

如果无法分配请求的字节数,则会引发异常。

于 2014-09-09T10:08:40.680 回答
4

放在上面的安全最大 Blob 大小是多少

似乎没有硬性限制,只是您的平台施加了任何限制。

但是,如果使用某种索引访问,则索引不应大于Number.MAX_SAFE_INTEGER,否则会发生有趣的错误。

幸运的是,2^53-1 字节大约是 8 PB,所以除非你正在做一些非常奇怪的事情,否则它不应该成为一个问题。

于 2017-06-29T13:53:44.607 回答
2

这是一个更新的答案,至少根据 Mozilla 在 2019 年 7 月的说法:

Array 或 ArrayBuffer 的长度属性用无符号 32 位整数表示,它只能存储 0 到 (2^32)-1 范围内的值。

(来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_array_length

截至 2020-01-09 的更多详情

Firefox 似乎限制了底层缓冲区的大小(因此限制是字节数),而 Chrome 似乎限制了类型化数组中的元素数量。此外,Firefox 的限制似乎低于我发布的 mozilla 链接所说的 - 根据这个链接

new ArrayBuffer(Math.pow(2, 32) - 1)

是“有效案例”,但在控制台中运行时会引发 RangeError(Windows 10 上的 Firefox 72.0.1 64 位)

于 2019-07-19T22:25:36.890 回答
1

我也在问自己同样的问题。缓冲区似乎受到可用系统内存和底层 JavaScript 引擎 GC 处理大量内存的能力的限制。您可以通过在浏览器的控制台中创建大型缓冲区并在另一端监控浏览器的进程和整体内存占用来轻松地为您的平台测试它。

我刚刚设法在 Chrome 37 上创建了大于 512MB 的缓冲区。但是我有 4GB 的系统内存,因此在更多分配后显然会导致崩溃。我对找到断点不感兴趣,因为我可以分配高达 100MB 的空间,但您显然可以自己轻松地测试它。

于 2014-09-09T09:35:30.517 回答
0

Mozilla 倾向于增加 > 2Gb - javascript.options.large_arraybuffers。默认情况下为 false,但在 Firefox 89 中应为 true

于 2021-04-23T07:09:33.430 回答