【问题标题】:How can I store a large (2Mb) dataset in persistent local storage?如何将大型 (2Mb) 数据集存储在持久性本地存储中?
【发布时间】:2016-02-11 16:00:08
【问题描述】:

我正在从 Firebase 数据库中检索大型活动的参与者列表 - 大约 4,000 名参与者。每个都表示为大约 500 字节的 JSON 对象。

检索数据集后,我试图将其存储在持久的本地存储中。最初我尝试使用 Lawnchair.js 使用标准 DOM 存储(localStorage)。

我观察到,在使用这种方法插入数据集时,Chrome 的内存使用量上升到大约 2GB。此外,由于保存到 localStorage 是同步的,这会阻塞 DOM,并且应用会在 30 秒内无响应。

我认为这可能是 Lawnchair 问题,所以我现在尝试使用 IndexedDB 切换到 localForage。这有两个很大的改进:

  1. localForage 是异步的,因此应用保持响应状态
  2. 内存使用量根本没有增加

但是,将数据写入索引数据库大约需要 10 分钟。前 5 分钟,CPU 处于 30% 左右,没有任何内容写入索引数据库。最后 5 分钟 CPU 停机,写入速度缓慢(可能 10 条记录/秒)。

我的问题是: 这些行为是否正常?如果是,我怎样才能将这些数据(大约 2Mb)存储在持久的本地存储中,而不需要花费很长时间或消耗大量内存?

【问题讨论】:

  • 有趣的是,我发现其他人谈论 localForage 将数千条记录写入索引数据库的速度很慢,例如github.com/mozilla/localForage/issues/301.
  • 在尝试使用 localForage (github.com/thgreasi/localForage-setItems) 批量插入此扩展并放入一些性能计数器后,我发现现在只需 17 秒即可“完成”插入所有 4000 条记录。但是,如果我检查索引数据库记录计数,当我的代码完成时它仍然显示 0。观察计数,我发现插入在 25 秒左右开始发生,并且需要几分钟才能完成。
  • 为什么不直接使用 indexedDB 呢?为什么要使用中间层?
  • 好点乔希。我确实考虑过,但我认为 localForage 在处理 IndexedDB API 方面可能会比我做得更好。

标签: local-storage indexeddb lawnchair localforage


【解决方案1】:

如果有人感兴趣,我已经将问题缩小到使用 localforage 我一直在尝试插入数千个键值对的事实,其值是 JSON 对象。这需要很长时间。而是先调用 JSON.stringify(obj) 并将字符串作为值插入 - 快 100 倍以上。

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 2014-11-29
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多