Поэкспериментировал тут, хз как ты 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>
Но скорее всего твоя задача решается просто по другому. Через стримы какие-нить. Очень редко когда действительно надо одновременно хранить в памяти такие объёмы.
=)