Как эффективно загружать большие файлы в хранилище IndexedDB? Мое приложение падает на 100 000 строк - PullRequest
0 голосов
/ 09 января 2019

У меня есть определенное веб-приложение, которое полагается на загрузку большого количества строк данных из локального файла на стороне клиента. Цель состоит в том, чтобы сохранить эти данные в indexeddb.

Данные содержат только два интересующих меня столбца, каждый из которых содержит строку символов длиной не более 25 символов, однако может содержать до 1 миллиона строк.

Читая много вопросов и документов, я создал код, который, кажется, работает при создании indexeddb с меньшими наборами данных ниже 20000 строк, но разбивается на большие данные.

Я уверен, что это из-за плохого дизайна, так как я новичок в этом стиле работы, или, возможно, из-за зависания в браузере Chrome - поскольку я не получаю никаких сообщений об ошибках, я могу вызвать оповещение о том, что достигнут последний цикл for, однако on.complete никогда не срабатывает, и база данных никогда не отображается как

Ввод функции e - чтение файла.

Я также выполняю операцию с данными в цикле for, но я удалил это для простоты.

function storeDataEnc (e) {
    var lines = e.target.result.split('\n');
    var request = self.indexedDB.open('DB', 1);
    request.onerror = function(e) {
        console.log("there was and error:" +e.target.errorCode);
    }
    request.onupgradeneeded = function(e){
        var db = request.result;
        var store = db.createObjectStore("col1", {
                    keyPath: "col2"} );
    };

    request.onsuccess = function(e) {

        var db = request.result;
        var tx = db.transaction("dataTable", "readwrite");

        var store = tx.objectStore("dataTable");

        db.onerror = function(e){
            console.log("ERROR" + e.target.errorCode);
        }


    for (var i = 0; i < lines.length; ++i) {
        var test = lines.length - 1;
        if (i == test) {console.log('nearly done')};

            function forEachLinenow (match) {
                if ( match.charAt( 0 ) != '#' ) {
                    match = match.trim();
                    var fields = match.split('\t');
                    var col1in = fields[0];
                    var col2in = fields[3];

                    store.put({ COL1: col1in, COL2: col2in              }
            }
        forEachLinenow(lines[i] + '\n');
    }
    tx.oncomplete = function() {
            db.close();
            alert("all data read");
        }
    }
}

Полагаю, я не понимаю какой-то проблемы с браузером, чтобы мешать вредоносным приложениям занимать слишком много ресурсов. Кто-нибудь использовал данные такого размера, кто может обнаружить ошибку в моем процессе.

Думаю, мне может понадобиться сгенерировать несколько транзакций, которые я пытался, но, похоже, не изменил мою проблему.

Я знаю, что это может быть медленно, однако сама скорость не самая большая проблема, если данные успешно переносятся.

1 Ответ

0 голосов
/ 09 января 2019

Возможно, вы превысили пределы размера данных браузера.

Здесь, в документации Mozilla, упоминаются ограничения https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Browser_storage_limits_and_eviction_criteria

А вот еще несколько ограничений indexeddb, задокументированных Google для популярных браузеров. https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/offline-for-pwa

Кажется, что все ограничения основаны на доступном хранилище операционной системы хоста. Проверьте размер данных, которые вы ожидаете импортировать, и доступное хранилище.

...