gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 04:56:26 24 4
gpt4 key购买 nike

我想在一个事务中将对象添加到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com