我尝试创建一个环形缓冲区,以便我可以存储大量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
处理程序。
非常感谢您的快速回答。
我已将代码扩展到onsuccess
和onerror
。但仍然有同样的问题。
虽然我没有找到解决方案,但对问题的解释是:即使保存的数据没有改变,IndexedDB 大小也会不断增长。
Chrome使用LevelDB的速度更快,但就我而言,我觉得这很烦人。