IndexedDB-Bug in Google Chrome



我尝试创建一个环形缓冲区,以便我可以存储大量json-Data。

目标是保存大约 300,000 条记录并周期性地更改它们。在测试中,我随机创建了 1,000 条记录(每条记录有 10 个浮点值(,并将它们作为 json 保存在 indexedDB 中。

为了持久化 IndexedDB,我使用了一个循环(从 0 到 99(和命令"put"。

我的观察如下:

  • 在第一次传递时,将创建数据库并成功保存 100 条记录。
  • 此外,第一次刷新有效,保存新的随机生成的浮点值。但内存利用率显著增加。
  • 第二次刷新后,不会更改随机数据,因为内存使用量已超出限制。

使用的索引数据库的键在循环中设置(从 0 开始,以 99 结束(。

在Firefox和MS Edge等其他浏览器中,即使刷新100次,测试运行良好。

是否有人知道问题,甚至更好的解决方案?

在重新加载页面时,从索引数据库中删除所有 Recrords 也是可以的。 所以我试图在初始化时删除所有数据 - 但在这里,内存使用率保持在较高水平。(超过 230 MB(。

function getObjectStore(store_name, mode) {
var tx = db.transaction(store_name, mode);
return tx.objectStore(store_name);
}
function putDbElement(number, json, _callback) {
var obj = {
number: number,
json: json
};
var store = getObjectStore(DB_STORE_NAME, 'readwrite');
var req;
try {
req = store.put(obj);
_callback();
} catch (e) {
throw e;
}
}

for ( var i = 0; i < 100; i++ ) {
putDbElement(
i,
getRandomJson( 1000 ),
function() {
console.log( "created: " + i );
}
);
}

IndexedDB 是异步的。 您将为每次迭代打开一个新事务。这可能是内存使用率高的原因。 你需要处理成功,错误。您可以使用循环,但它们必须在transaction内,onsuccess。然后,每个put操作也必须有自己的success/error处理程序。

非常感谢您的快速回答。

我已将代码扩展到onsuccessonerror。但仍然有同样的问题。

虽然我没有找到解决方案,但对问题的解释是:即使保存的数据没有改变,IndexedDB 大小也会不断增长。

Chrome使用LevelDB的速度更快,但就我而言,我觉得这很烦人。

相关内容

最新更新