如何在客户端上减少JSON.stringify使用的内存量?

时间:2018-06-02 03:34:29

标签: javascript json indexeddb

使用JSON.stringify将大型javascript对象转换为字符串时,有没有办法减少客户端上的内存使用量?

我正在寻找解决以下问题的内容,但是客户端上的javascript。

Writing JSON to a stream without buffering the string in memory

当我尝试一个简单的JSON.stringify(big_object)时,它会迅速占用所有内存并冻结我的电脑。

当我尝试将大对象写入indexedDB时会发生相同的内存使用问题,详见此处。

Example of memory leak in indexedDB at store.add (see Example at Edit)

三年前的这两个问题似乎有同样的问题,但我找不到找到解决方案。

How can I make a really long string using IndexedDB without crashing the browser?

JSON.stringify optimization

更大的问题是:在用户可以在indexedDB数据库中累积大量数据的离线Web应用程序中,将该数据备份到硬盘的过程似乎是将数据写入一个对象,将对象转换为字符串,将字符串转换为一串文本,然后将blob下载到磁盘。要上传文件并将其写回数据库,请执行相反的操作。但是,大对象上的JSON.stringify和JSON.parse会占用所有内存并导致浏览器或整个计算机崩溃。

此链接似乎表明indexedDB中的大blob问题已经解决,但这似乎无法解决此问题,是吗?该对象不能直接转换为blob,可以吗?如果是这样,可以从blob中恢复有组织的对象吗?

不稳定的IndexedDB大文件存储操作导致IndexedDB消耗大量未释放的内存。 https://bugzilla.mozilla.org/show_bug.cgi?id=1223782

除了让用户下载和上传多个文件进行备份并恢复他们保存在数据库中的工作外,还有另一种方法可以在客户端和离线时完成此操作吗?

感谢您提供的任何指示。

1 个答案:

答案 0 :(得分:1)

"当我尝试将大对象写入indexedDB时会发生相同的内存使用问题,详见此处。"

indexDB在移动设备上的限制为5mb /桌面上的50mb,因此如果您的对象超出了与indexDB一样的基于设备的边界

对于从大型对象创建大量刺痛,您可能会遇到V8字符串长度限制,目前限制为512MB。因此,您需要使用基于流的解析/序列化,如big-json