javascript - 优化批量( block )将对象上传到 IndexedDB

标签 javascript indexeddb

我想在一个事务中将对象添加到 IndexedDB 中的某个表中:

_that.bulkSet = function(data, key) {
    var transaction = _db.transaction([_tblName], "readwrite"),
        store = transaction.objectStore(_tblName),
        ii = 0;

    _bulkKWVals.push(data);
    _bulkKWKeys.push(key);

    if (_bulkKWVals.length == 3000) {
        insertNext();
    }

    function insertNext() {
        if (ii < _bulkKWVals.length) {
            store.add(_bulkKWVals[ii], _bulkKWKeys[ii]).onsuccess = insertNext;
            ++ii;
        } else {
            console.log(_bulkKWVals.length);
        }
    }
};

看起来它工作正常,但它不是非常优化的方法,尤其是当对象数量非常多时 (~50.000-500.000)。我怎么可能优化它?理想情况下,我想先添加 3000,然后将其从数组中删除,然后再添加 3000,即分块添加。有什么想法吗?

最佳答案

连续插入那么多行不可能获得良好的性能。

我是 IndexedDB dev并拥有您所谈论的规模的 IndexedDB 的实际经验(连续写入数十万行)。它不太漂亮。

在我看来,IDB不适合在需要连续写入大量数据的情况下使用。如果我要构建一个需要大量数据的 IndexedDB 应用程序,我会想办法随着时间的推移慢慢播种它。

问题是写入,我看到的问题是写入速度缓慢,加上它们的 i/o 密集型性质,随着时间的推移会变得更糟。 (在 IDB 中,读取总是快如闪电,物有所值。)

首先,您将从重复使用交易中获得节省。因此,您的第一直觉可能是尝试将所有内容都塞进同一个事务中。但从我在 Chrome 中发现的情况来看,例如,浏览器似乎不喜欢长时间运行的写入,这可能是因为某种机制旨在限制行为不端的选项卡。

我不确定您看到的性能如何,但根据测试的规模,平均数字可能会欺骗您。限制更快的是吞吐量,但如果您尝试连续插入大量数据,请特别注意随时间推移的写入。

我碰巧正在开发一个有几十万行可供我使用的演示,并且有统计数据。在禁用可视化、在 IDB 上运行纯破折号的情况下,这是我现在在 Chrome 32 中看到的单个对象存储上的内容,该对象存储具有单个非唯一索引和一个自动递增的主键。

一个小得多的 27k 行数据集,我每秒看到 60-70 个条目:
* ~30 秒:平均 921 个条目/秒(开始时总是有大量插入),在我采样的那一刻是 62/秒
* ~60 秒:平均 389/秒(持续下降开始超过初始爆发的影响)目前为 71/秒
* ~1:30: 258/秒,此刻 67/秒
* ~2:00(~1/3 完成):平均 188/秒,目前 66/秒

一些具有更小数据集的示例显示出更好的性能,但具有相似的特征。同上更大的数据集 - 效果被大大夸大了,我看到离开多个小时时每秒只有 <1 个条目。

关于javascript - 优化批量( block )将对象上传到 IndexedDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22247614/

相关文章:

javascript - 如何将滚动速度更改为平滑?

JavaScript:作为关联数组键的希伯来字母不起作用

javascript - indexedDB 无法在 "onupgradeneeded"事件上将数据插入数据库

javascript - React - 在 sibling 之间传递状态?

javascript - TypeError : Cannot read property 'whenReady' of undefined

indexeddb - 如何保证 Indexeddb 事务完成单元测试序列?

javascript - 优化 : Get specific Value(and not more) from IndexedDB

javascript - 如何触发依赖于 2 个(或更多)条件的 JS 事件

javascript - indexedDB.deleteDatabase() 不删除?

javascript - 将 javascript 更改为 jquery 时按钮值消失