Как задать ограничение на количество ключей у объекта?
Сейчас при добавлении 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, время: 04:33. |