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 шт):
Это проблема движка 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)
}