Do ArrayBuffers have a maximum length?

前端 未结 4 1060
失恋的感觉
失恋的感觉 2020-12-11 18:14

I little confused here. Do ArrayBuffer allocate a new memory region for it? If so, what would be the safe maximum Blob size to put on it?

相关标签:
4条回答
  • 2020-12-11 19:04

    what would be the safe maximum Blob size to put on it

    There does not seem to be a hard limit, just whatever restrictions your platform imposes.

    However, if one uses some sort of indexed access, indexes shouldn't be greater than Number.MAX_SAFE_INTEGER, because interesting bugs would happen otherwise.

    Luckily, 2^53-1 bytes is around 8 petabytes so it shuoldn't be a concern unless you are doing something really weird.

    0 讨论(0)
  • 2020-12-11 19:05

    I was also asking myself the same question. It seems that buffer is limited by available system memory and the ability of underlying JavaScript engine's GC to handle large amounts of memory. You can easily test it for your platform by creating large buffers in your browser's console and on the other side monitoring browser's process and overall memory footprint.

    I just managed to create buffers larger than 512MB on Chrome 37. However I have 4GB of system memory so it could obviously lead to crash after more allocation. I'm not interested in finding breaking point since I'm fine with allocations up to 100MB, but you can obviously test it easily for yourself.

    0 讨论(0)
  • 2020-12-11 19:08

    That only depends on your system and there doesn't seems to be a limit.

    According to the specification :

    If the requested number of bytes could not be allocated an exception is raised.

    0 讨论(0)
  • 2020-12-11 19:15

    Here's an updated answer, at least according to Mozilla in July 2019:

    The length property of an Array or an ArrayBuffer is represented with an unsigned 32-bit integer, that can only store values which are in the range from 0 to (2^32)-1.

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

    More details as of 2020-01-09:

    Firefox seems to limit the size of the underlying buffer (so the limit is the number of bytes) whereas Chrome seems to limit the number of elements in a typed array. Also, Firefox's limit seems to be lower than what the mozilla link I posted says - according to the the link this

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

    is a "valid case" but it throws a RangeError when run in the console (Firefox 72.0.1 64 bit on Windows 10)

    0 讨论(0)
提交回复
热议问题