IndexedDB-ошибка в Google Chrome - PullRequest
       12

IndexedDB-ошибка в Google Chrome

0 голосов
/ 22 октября 2018

Я пытаюсь создать кольцевой буфер, чтобы я мог хранить большое количество json-Data.

Цель - сохранить около 300 000 записей и циклически изменять их.Для теста я случайно создал 1000 записей (с 10 значениями с плавающей запятой на запись) и сохранил их как json в indexedDB.

Чтобы сохранить в IndexedDB, я использовал цикл (от 0 до 99) икоманда "положить".

Мое наблюдение заключается в следующем:

  • При первом проходе БД создается и 100 записей успешно сохраняются.
  • Также, первое обновление работает, новые случайно сгенерированные значения с плавающей точкой сохраняются.Но использование памяти значительно увеличивается.
  • После второго обновления случайные данные не будут изменены, поскольку использование памяти превысило предел.

Ключ для использованной indexedDBустанавливаются в цикле (начинается с 0 и заканчивается на 99).

В других браузерах, таких как Firefox и MS Edge, тест работает хорошо даже после 100 обновлений.

Есть ли кто-нибудь, кто знает проблему или даже лучше, имеет решение?

Также можно удалить все записи из indexedDB, пока страница перезагружается.Поэтому я попытался удалить все данные во время инициализации, но и здесь использование памяти оставалось на высоком уровне.(более 230 МБ).

function getObjectStore(store_name, mode) {
  var tx = db.transaction(store_name, mode);
  return tx.objectStore(store_name);
}

function putDbElement(number, json, _callback) {
    var obj = {
        number: number,
        json: json
    };

    var store = getObjectStore(DB_STORE_NAME, 'readwrite');
    var req;
    try {
        req = store.put(obj);
        _callback();
    } catch (e) {
        throw e;
    }
}



  for ( var i = 0; i < 100; i++ ) {
    putDbElement(
      i,
      getRandomJson( 1000 ),
      function() {
        console.log( "created: " + i );
      }
    );
  }

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Большое спасибо за быстрый ответ.

Я расширил код до onsuccess и onerror. Но все еще была та же проблема.

Хотя я не нашел решения,но объяснение проблемы: Размер IndexedDB продолжает расти, даже если сохраненные данные не меняются .

Chrome использует LevelDB для ускорения, но в моем случае это раздражает.

0 голосов
/ 23 октября 2018

IndexedDB является асинхронным.Вы открываете новую транзакцию для каждой итерации.Это может быть причиной высокого использования памяти.Вы должны справиться с успехом, ошибкой.Вы можете использовать петли, но они должны быть в пределах transaction, onsuccess.Тогда каждая операция put должна иметь свои собственные обработчики success/error.

...