Как задать ограничение на количество ключей у объекта?
Сейчас при добавлении 48 млн ключей процесс зависает и перестает отвечать. В разных версиях и реализациях javascript разные лимиты установлены.
Есть ли возможность увеличить этот лимит?
let cicles = 0;
const asMap = {};
result.map((item) => {
const k_ = Object.keys(item);
let str = '';
for (let i = 0; i < k_.length; i++) {
str += `${item[k_[i]]}_`;
cicles++;
}
asMap[str] = item;
if(cicles % 100000 === 0){
console.log('result3 map cicles='+cicles);
}
});
|
Поэкспериментировал тут, хз как ты 40 лямов достиг.)
Хром виснет на 8 (2^23), Фокс честно кидает ouy of memory на 16 (2^24). Скорее всего это хардкод лимит конкретной реализации и тебе его его не поменять. Но и смысл какой - поиск по ключу в таком мега-объекте будет не слишком быстрей поиска в массиве. Если очень хочется - напиши себе кастомный Map, который внутри будет состоять из множества Map\объектов. Что-то типа такого:
function createMegaObject() {
const arr = [{}];
const limit = 0xfffff;
let count = 0;
return new Proxy({}, {
get(target, key) {
for(let i = 0; i < arr.length; i++) {
if(key in arr[i])
return arr[i][key];
}
},
set(target, key, value) {
for(let i = 0; i < arr.length; i++) {
if(key in arr[i])
return arr[i][key] === value;
}
if(++count < limit)
return arr[0][key] = value;
count = 1;
arr.unshift({
[key]: value
});
}
})
}
<body>
0
<script id="worker1" type="javascript/worker">
const delay = () => new Promise(setTimeout);
function createMegaObject() {
const arr = [{}];
const limit = 0xfffff;
let count = 0;
return new Proxy({}, {
get(target, key) {
for(let i = 0; i < arr.length; i++) {
if(key in arr[i])
return arr[i][key];
}
},
set(target, key, value) {
for(let i = 0; i < arr.length; i++) {
if(key in arr[i])
return arr[i][key] === value;
}
if(++count < limit)
return arr[0][key] = value;
count = 1;
arr.unshift({
[key]: value
});
}
})
}
self.onmessage = async () => {
let i = 0;
const max = 1e9;
const map = createMegaObject();
try {
while(i < max) {
map[`_key${i}`] = `_val${i}`;
if(i % 10000 === 0) self.postMessage(i);
i++
}
} catch(e) {
self.postMessage(i + ':' + e);
}
};
</script>
<script>
var blob = new Blob([
document.querySelector('#worker1').textContent
], { type: "text/javascript" })
var worker = new Worker(window.URL.createObjectURL(blob));
worker.onmessage = function(e) {
document.body.firstChild.data = e.data;
}
worker.postMessage("start"); // Start the worker.
</script>
Но скорее всего твоя задача решается просто по другому. Через стримы какие-нить. Очень редко когда действительно надо одновременно хранить в памяти такие объёмы. =) |
| Часовой пояс GMT +3, время: 19:11. |