JS. Предел количества элементов Set

Есть такой код:
(осторожно с запуском, тк очень много вычислений)

const arr = []
const set = new Set()

const count = 100_000_000
let isEnded = false

for (let i = 0; i < count && !isEnded; i++) {
  try {
    const id = generateUniqId()
    arr.push(id)
    set.add(id)
  } catch (e) {
    isEnded = true
    console.log(`Ошибка на ${i} итерации`)
  }
}

console.log('Количество элементов:', arr.length);
console.log('Set элементов:', set.size);

function generateUniqId() {
  return Math.random()
}

Принцип работы:
Наполняет arr и set 100_000_000 (ста миллионами) элементов
Но во время выполнения, постоянно ошибка при добавлении в set 16777217-го элемента:

RangeError: Value undefined out of range for undefined options property undefined 

Из за чего это может быть?
Нигде раньше не встречал в описании Set-а, что его размер ограничен

Если ограничения есть, то в чём?
В кол-ве элементов, или байтовом размере или что-то другое?


Ответы (2 шт):

Автор решения: UserTest013

Это проблема движка V8, вот тикет на их баг трекере. Судя из комментариев исправлять эту проблему не собираются. В FF данной проблемы нету. https://bugs.chromium.org/p/v8/issues/detail?id=11852

→ Ссылка
Автор решения: Евгений Кулик

скорей всего, вы превышаете квоту на ячейку памяти в JS в 16МБ

дело не в Set, потому что, если убрать его из кода, код будет ломаться и страница просто не отвечает.

Math.random() выдает число в таком виде 0.4092814434418963, каждая цифра в этом числе занимает байт, если округлить Math.random(), то ваш код отлично работает

в таком случае каждое сгенерированное число занимает меньше места в памяти

const arr = []
const count = 100_000_000
let set = new Set()
let isEnded = false

for (let i = 0; i < count && !isEnded; i++) {
    try {
        const id = generateUniqId()
        arr.push(id)
        set.add(id)
    } catch (e) {
        isEnded = true
        console.log(`Ошибка на ${i} итерации`)
    }
}

console.log('Количество элементов:', arr.length);
console.log('Set элементов:', set.size);

function generateUniqId() {
    return Math.random().toFixed(2)
}

→ Ссылка