提高大量IndexedDB插入的性能

时间:2015-03-25 01:10:49

标签: javascript ios performance ipad indexeddb

我们正在尝试将关于Web应用程序负载的大量数据预先缓存到索引数据库中。从我的性能测试来看,桌面浏览器(例如Internet Explorer)的速度是不错的,我可以在2秒左右插入10,000条记录。但是,比较iPad上完全相同的功能,它降至30秒。这种比较让我大吃一惊。

有没有人知道将大数据集插入indexedDB的任何提示或技巧。我不知道它是否可能,但是如果我们可以建立一个indexedDB服务器端的副本,其中所有数据都已预先填充,然后将其拍摄到客户端,它只是将其存储到浏览器中。这些方面的任何事都可行吗?

由于

3 个答案:

答案 0 :(得分:1)

我遇到了大量批量插入(100.000 - 200.000条记录)的问题。我使用Dexie库解决了所有的IndexedDB性能问题。它有这个重要特征:

  

Dexie表现出色。它的批量方法利用了它   indexedDB中一个不为人知的功能,可以存储   没有收听每个onsuccess事件的东西。这加速了   表现达到最大。

Dexie:https://github.com/dfahlander/Dexie.js

答案 1 :(得分:0)

您的数据如何存储在indexeddb中?是否所有事物都在一个对象存储库中使用多个对象库。您是否立即需要所有缓存数据?

如果您只有一个对象存储,则可以从存储您最初需要的所有数据开始,提交该事务并为所有其他事件启动新事务。这样,您可以在插入其余数据时开始检索初始数据。 IndexedDB是异步的,所以它应该阻止你。

如果您有多个对象存储,则可以使用相同的stratigy。首先填写你需要的对象库,然后推迟其他对象库。

或者可以考虑使用AppCache API而不是indexeddb api。使用此方法,您只需缓存包含要缓存的所有json对象的javascript文件。当您不需要对数据进行大量查询时,就会出现这种情况。

答案 2 :(得分:0)

一些非常糟糕的 IndexedDB 性能问题可能是由于浏览器长时间仅调用 onsuccess 回调并在工作实际完成后遇到事件循环开销而引起的。我的应用程序观察到的性能模式是它做了很多工作,然后它只是非常低效地回答了数千个回调:

screenshot of chrome profiler showing a bunch of things with readable function names in solid fill, then a bunch of lighter regions almost as if greyed out

这张图片的右手部分是每个请求的回调。这样做的解决方案当然是不对每个请求都设置回调,但我之前不清楚如何做到这一点。

Dexie.js 完成此操作的方式(有关详细信息,请参阅 src/dbcore/dbcore-indexeddb.ts)是它保存最后发送的请求(例如 IDBObjectStore.put 等)并设置 onsuccess 回调那个,然后从其余请求中收集结果。因此,它避免了回调地狱。

另一种方法是使用 IDBTransaction.oncomplete 事件,完全不用担心单个请求的回调。

(注意:是的,我知道这个问题有多老了,我今天遇到了这个问题,想为这个在 Google 结果中排名靠前的问题添加一些更有用的东西)

相关问题