超过最大IPC消息大小

kao*_*343 2 google-chrome indexeddb

目前,我正在开发在网络浏览器上运行的工具。

在此项目中,我将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 textResult通过getAll()IndexedDB 的方法获得,由projectId或过滤analysisId

我的问题是...

  1. 如何避免这个错误?
  2. 我想抢救存储在IndexedDB中的数据。我知道数据存储在本地文件系统中的位置。如果可能的话,该怎么做?

Jos*_*osh 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相同。