当前,我正在开发在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 text
和Result
通过IndexedDB的getAll()
方法获得,并由projectId
或analysisId
过滤。我的问题是...
答案 0 :(得分:2)
如果您查看导致Chrome实现中该错误的原因,例如https://chromium.googlesource.com/chromium/src.git/+/master/content/browser/indexed_db/indexed_db_database.cc,则在消息大小太大时会发生。这里的消息大小基本上是指由于某种处理而从C ++(浏览器二进制文件)发送到Javascript的数据量。
为避免发送太多数据,您可以做一些事情:
我认为您最好的选择是尝试切换到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集合;整个表格或任何查询的结果。