react.js IndexDB большое хранилище данных. проблемы с производительностью

#javascript #reactjs #storing-data

#javascript #reactjs #хранение-данные

Вопрос:

У меня есть массив объектов, которые могут содержать миллионы строк. Я пытаюсь сохранить его в IndexDB, и я могу сделать это успешно, но у него есть некоторые проблемы с производительностью в методе «put». Причина в том, что мне приходится перебирать каждый индекс и помещать его в IndexDB по отдельности. Есть ли способ просто выгрузить весь массив здесь? вот мой код…

     var indexDB;
    indexDB = window.indexedDB; 
    var open = indexedDB.open("HistoricalDB");
    open.onupgradeneeded = function(){
    let db = open.result;
    let store = db.createObjectStore("HistoricalTable", {keyPath: "id"});
    let index = store.createIndex("CIndex", ["time", "value"]);
    };
    open.onsuccess = function(){
        let db = open.result;
        let tx = db.transaction("HistoricalTable", "readwrite");
        let store = tx.objectStore("HistoricalTable");
        let index = store.index("CIndex");
        for (let i=0; i<allHistoricalData.length-1; i  ){
            store.put(allHistoricalData[i]);
        }
        let getAll = store.getAll();
        getAll.onsuccess = function(){
            console.log(getAll.result)
        }
        tx.oncomplete = function(){
            db.close();
        };
    }
 

Вот что меня убивает….

         for (let i=0; i<allHistoricalData.length-1; i  ){
            store.put(allHistoricalData[i]);
        }
 

Есть ли способ сделать store.put(allHistoricalData) вместо store.put(allHistoricalData[i] в цикле?

Ответ №1:

IndexDB может хранить любые клонируемые данные javascript, поэтому вы должны иметь возможность просто хранить массив целиком.

Я вижу, что вы создаете индекс и используете его для хранения значений. Индексы IndexDB используются для поиска данных в хранилище, но не должны использоваться для хранения самих данных.

То, что вы хотите сделать, это поместить данные непосредственно в хранилище следующим образом:

 var open = window.indexedDB.open('HistoricalDB');

open.onupgradeneeded = function () {
  let db = open.result;
  db.createObjectStore('HistoricalTable');
};

open.onsuccess = function () {
  let db = open.result;
  let tx = db.transaction('HistoricalTable', 'readwrite');
  let store = tx.objectStore('HistoricalTable');
  let request = store.put(allHistoricalData, 'DATA');

  request.onsuccess = function () {
    console.log('success!');
  };
  request.onerror = function () {
    console.log(request.error);
  };
};
 

Комментарии:

1. Должен ли я создать хранилище таким образом… пусть store = db.createObjectStore(«HistoricalTable»);

2. Да, если вы не используете ключевые пути, вам не нужно указывать какие-либо параметры.

3. Имейте в виду, что если вы храните миллионы строк, то функция put, вероятно, займет некоторое время. Что это делает, так это позволяет этому процессу происходить асинхронно, чтобы ваше приложение могло продолжать функционировать.

4. Можете ли вы показать полный код? У меня все еще возникают проблемы. Моя компиляция потерпела крах.

5. обновленный ответ, чтобы показать полный код для хранения данных, я позволю вам обрабатывать извлечение данных