Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象优化批量(块)上载到IndexedDB_Javascript_Indexeddb - Fatal编程技术网

Javascript 将对象优化批量(块)上载到IndexedDB

Javascript 将对象优化批量(块)上载到IndexedDB,javascript,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(

我想在一个事务中将对象添加到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);
        }
    }
};
\u that.bulkSet=函数(数据、键){
var transaction=_db.transaction([[u tblName],“readwrite”),
store=transaction.objectStore(\u tblName),
ii=0;
_bulkKWVals.push(数据);
_按键。按(键);
如果(_bulkKWVals.length==3000){
insertNext();
}
函数insertNext(){
如果(ii<_bulkKWVals.长度){
store.add(_bulkKWVals[ii],_bulkkwkey[ii]).onsuccess=insertNext;
++二,;
}否则{
控制台日志(_bulkKWVals.length);
}
}
};

看起来它工作得很好,但这不是一种非常优化的方法,尤其是当对象数量非常高(约50.000-500.000)时。我怎样才能优化它呢?理想情况下,我希望先添加3000个,然后将其从数组中删除,然后再添加3000个,即分块添加。有什么想法吗?

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

我是IndexedDB,对IndexedDB在您所说的规模(连续写数十万行)方面有实际经验。它不太漂亮

在我看来,IDB不适合在需要连续写入大量数据时使用。如果我要设计一个需要大量数据的IndexedDB应用程序,我会找到一种方法,随着时间的推移慢慢地为它播种

问题是写操作,而我所看到的问题是,写操作的缓慢,加上它们的I/o密集性,会随着时间的推移变得更糟。(IDB的读取速度总是很快,这是值得的。)

首先,您将从重复使用事务中获得节省。因此,您的第一反应可能是尝试将所有内容塞进同一事务中。但从我在Chrome中发现的情况来看,例如,浏览器似乎不喜欢长时间运行的写操作,可能是因为某种机制旨在限制不正常的标签

我不确定你看到的是什么样的性能,但平均数字可能会欺骗你,这取决于你的测试规模。速度的限制是吞吐量,但如果您试图连续插入大量数据,请特别注意随时间的写入

我碰巧正在做一个演示,有几十万行可供我使用,并且有统计数据。在禁用可视化功能的情况下,在IDB上运行纯破折号,下面是我现在在Chrome32中看到的,在一个对象存储上,有一个非唯一索引和一个自动递增的主键

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


一些具有更小数据集的示例显示了更好的性能,但具有相似的特征。更大的数据集也是如此——效果被大大夸大了,我只看到了IndexedDB实际上是为批量操作而设计的。问题是,规范和某些文档没有宣传它的工作方式。如果一定要注意中定义IDBObjectStore中所有变异操作如何工作的部分(add()、put()、delete()),您会发现它允许调用者同步调用它们,而不必侦听成功事件,只侦听最后一个。如果不这样做(但仍然听OneRor),您将获得巨大的性能提升

因为它在我的macbook pro上以680毫秒的速度插入10000行(使用Opera/Chromium)

通过库中的Table.bulkPut()方法完成:


我也做了一些基准测试,在1000个事务中插入1000个,猜猜看:[创建事务+获取存储]=20秒,[插入]=10秒。。。第一个有严重的问题
db.objects.bulkPut(arrayOfObjects)