作者:yu诚_530 | 来源:互联网 | 2022-12-02 17:52
目前,我正在开发在网络浏览器上运行的工具。
在此项目中,我将IndexedDB与Dexie.js 2.x版一起使用。
在Google Chrome浏览器上,我提到了错误“超出了最大IPC邮件大小”。可能是由于将如此巨大的数据放入IndexedDB引起的。我的临时实现是通过将数组转换为字符串JSON.stringify
,我曾经可以解决这个问题。但是,问题再次发生。
在我的应用程序中,Project
定义了一个聚合。
每个Project
最多有500个Input text
。
每个Input text
都有1个字符串,其长度最大为50k。
此外,每个Project
都有Analysis
,但仅包含分析参数。
每个Analysis
都有很多Result
。
每个Result
包含的长度为20k。
Input text
并Result
通过getAll()
IndexedDB 的方法获得,由projectId
或过滤analysisId
。
我的问题是...
如何避免这个错误?
我想抢救存储在IndexedDB中的数据。我知道数据存储在本地文件系统中的位置。如果可能的话,该怎么做?
Josh..
5
如果您查看是什么原因导致Chrome实施中出现此错误,例如https://chromium.googlesource.com/chromium/src.git/+/master/content/browser/indexed_db/indexed_db_database.cc,则在出现以下消息时会发生尺寸太大。这里的消息大小基本上是指由于某种处理从C ++(浏览器二进制文件)发送到Javascript的数据量。
为避免发送太多数据,您可以执行以下操作:
确保您永远不会在大量数据上调用getAll
在可能的大量数据上调用getAll时使用限制
使用openCursor而不是getAll
存储较小的对象
我认为您最好的选择是尝试切换到openCursor。这将一次检索一个项目(每个请求)。这样,您将避免遇到此错误。使用游标会损失一点点速度,但是会获得可伸缩性。
要使光标像getAll一样工作,这很简单。您需要做的就是首先声明一个空数组,然后启动游标并进行迭代,每次将游标项添加到该数组中。在迭代结束时,您基本上一次组装了一个数组,结果与调用getAll相同。
1> Josh..:
如果您查看是什么原因导致Chrome实施中出现此错误,例如https://chromium.googlesource.com/chromium/src.git/+/master/content/browser/indexed_db/indexed_db_database.cc,则在出现以下消息时会发生尺寸太大。这里的消息大小基本上是指由于某种处理从C ++(浏览器二进制文件)发送到Javascript的数据量。
为避免发送太多数据,您可以执行以下操作:
确保您永远不会在大量数据上调用getAll
在可能的大量数据上调用getAll时使用限制
使用openCursor而不是getAll
存储较小的对象
我认为您最好的选择是尝试切换到openCursor。这将一次检索一个项目(每个请求)。这样,您将避免遇到此错误。使用游标会损失一点点速度,但是会获得可伸缩性。
要使光标像getAll一样工作,这很简单。您需要做的就是首先声明一个空数组,然后启动游标并进行迭代,每次将游标项添加到该数组中。在迭代结束时,您基本上一次组装了一个数组,结果与调用getAll相同。