超过最大IPC消息大小

时间:2018-10-09 09:26:11

标签: google-chrome indexeddb

当前,我正在开发在Web浏览器上运行的工具。

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

我的问题是...

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

3 个答案:

答案 0 :(得分:2)

如果您查看导致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 :(得分:0)

如果您在某些大型数据集中使用Dexie的toArray()方法,请尝试使用offset(number)limit(number)限制记录的数量,以批量获取数据

答案 2 :(得分:0)

我无法找到类似游标的方式使用Dexie进行查询(可能看起来不够难),但我想继续使用Dexie作为我的抽象层。

我既需要检索所有记录,又要根据ID(与您相同)检索一个子集,然后我想到了以下解决方案:

shift_time <- data.frame(
  started_at = c("2019-09-01 02:00:00 AEST", "2019-09-02 05:00:00 AEST", "2019-11-04 20:00:00 AEDT"),
  ended_at = c("2019-09-01 11:30:00 AEST", "2019-09-02 19:00:00 AEST", "2019-11-05 04:00:00 AEDT")
)

如果您需要随时处理记录(我已经做了),可以添加一个public_holidays <- data.frame( hol_name = c('Cup Day', 'Christmas'), date = c("2019-11-05", "2019-12-25") ) 参数,并在将每个元素添加到数组之前为每个元素调用该参数。

该函数非常灵活,因为您可以将其传递给任何Dexie集合;整个表格或任何查询的结果。