Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2021, 17:03
Новичок на форуме
Отправить личное сообщение для manking Посмотреть профиль Найти все сообщения от manking
 
Регистрация: 23.03.2012
Сообщений: 4

Как задать ограничение на количество ключей у объекта?
Сейчас при добавлении 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);
    }
  });
Ответить с цитированием
  #2 (permalink)  
Старый 13.11.2021, 17:34
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Поэкспериментировал тут, хз как ты 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>


Но скорее всего твоя задача решается просто по другому. Через стримы какие-нить. Очень редко когда действительно надо одновременно хранить в памяти такие объёмы.
=)
__________________
29375, 35

Последний раз редактировалось Aetae, 13.11.2021 в 19:07.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas. Как сделать или вообще нельзя? Вращение рандомизированно изменяемого объекта. Zemsky Общие вопросы Javascript 30 19.12.2013 19:44
Как вставить изображение из объекта new Image в тег <img Danxil Общие вопросы Javascript 1 11.11.2013 10:34
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
Как правильно задать ID в создаваемом элементе ? Indiana Events/DOM/Window 15 31.10.2010 16:15
Как по событию вызвать метод определенного экземпляра объекта jvs jQuery 3 24.12.2009 16:04