Javascript 使用web worker进行字符串化

Javascript 使用web worker进行字符串化,javascript,json,reactjs,web-worker,Javascript,Json,Reactjs,Web Worker,因此,我有一个应用程序需要JSON.stringify将其数据放入本地存储,但随着数据越来越大,此操作的成本变得异常高昂 因此,我尝试将其转移到webWorker上,使其脱离主线程,但我现在了解到,将对象发布到webWorker甚至比将其字符串化更昂贵 所以我想我是在问,有没有什么方法可以让JSON.stringify脱离主线程,或者至少降低成本 我熟悉快速json stringify,但我不认为每次都能提供完整的模式 您已经正确地观察到,将对象传递给web worker的成本与序列化它的成本相

因此,我有一个应用程序需要
JSON.stringify
将其数据放入本地存储,但随着数据越来越大,此操作的成本变得异常高昂

因此,我尝试将其转移到webWorker上,使其脱离主线程,但我现在了解到,将对象发布到webWorker甚至比将其字符串化更昂贵

所以我想我是在问,有没有什么方法可以让
JSON.stringify
脱离主线程,或者至少降低成本


我熟悉
快速json stringify
,但我不认为每次都能提供完整的模式

您已经正确地观察到,将对象传递给web worker的成本与序列化它的成本相同。这是因为web工作人员还需要接收序列化数据,而不是本机JS对象,因为实例对象绑定到创建它们的JS线程

通用解决方案适用于许多编程问题:在处理大型数据集时选择了正确的数据结构。当数据变得更大时,最好牺牲访问的简单性来提高性能。因此,任何一项:

在indexedDB中存储数据 如果您的大对象包含同类条目的列表,那么使用索引数据库进行读写,您根本不需要担心序列化。这需要对代码进行重构,但这是适用于大型数据集的正确解决方案

将数据存储在ArrayBuffer中
如果数据大多是固定大小的值,请使用ArrayBuffer。ArrayBuffer可以立即复制或移动到web worker,如果您的条目大小相同,则可以并行完成序列化。对于访问,您可以编写简单的包装器类,将二进制数据转换为更可读的内容。

此数据有多大?好吧,在某些浏览器中,localStorage的限制大约为5MB,因此如果超过这个限制,您将遇到问题。可转移对象呢?这些是通过引用传递的,而不是复制的。您能添加我们正在讨论的数据大小吗?数据集有多大?您要解析多少字节?@zero298这可能真的可以做到-我不知道这些!数据很少接近5MB—主要问题是它的字符串化频率有多高。当它坏了时,主线程每分钟被锁定5-10次。在MacBook Air上,它可以暂停2-3秒。@zero298发现我需要将我的对象转换为ArrayBuffer以将其用作可转移对象,这与stringify非常相似。我将尝试使用IndexedDb,我想我可以跳过严格化。这正是我最终所做的,Tomás。IndexedDb发挥了作用。非常感谢你的详尽回答!