目前,我正在开发运行在web浏览器上的工具。
在这个项目中,我使用的是IndexedDB和Dexie.js ver2.x。
在Google上,我提到了错误“最大IPC消息大小超过”。很可能,这是由于将如此庞大的数据放入IndexedDB而造成的。我的临时实现是通过JSON.stringify
将数组转换为字符串,而我曾经能够解决这个问题。然而,这个问题又发生了。
Project
的聚合。Project
有多达500个Input text
。Input text
有一个字符串,其长度高达50k。Project
都有Analysis
,但它只包含分析参数。Analysis
都有大量的Result
。Result
包含的长度为20k。Input text
和Result
分别用IndexedDB的getAll()
法、projectId
法或analysisId
法进行滤波。我的问题是..。
发布于 2018-10-11 04:42:23
如果您查看在Chrome实现(如database.cc )中导致此错误的原因,当消息大小太大时就会发生错误。在这里,消息大小基本上是指由于某种处理而从C++ (浏览器二进制文件)发送到Javascript的数据量。
为了避免发送太多的数据,您可以做一些事情:
我认为你最好的选择是尝试改用openCursor。这将每次检索您的项目(每个请求)。这样,您将避免遇到此错误。使用游标会损失一点点速度,但会获得可伸缩性。
要像getAll那样使用游标来工作,它很简单。您所需要做的就是首先声明一个空数组,然后启动游标,并在每次向数组中添加游标项时进行迭代。在迭代结束时,您基本上是从一个时间开始组装的,这些数组的结果与调用getAll的结果相同。
发布于 2019-10-22 22:52:25
我找不到一种像游标一样的方式来查询Dexie (可能看得不够仔细),但是我想继续使用Dexie作为我的抽象层。
我既需要检索所有记录,也需要基于ID检索子集(与您相同),我想出了以下内容,解决了我们的问题:
/**
* Retrieve all of Dexie collection
*
* We can't just call Collection.toArray() because once the result is large
* enough, we'll get "Maximum IPC message size exceeded" error. This is a
* memory-friendly implementation. Although maybe a bit slow due to a page
* size of one.
*/
function retrieveDexieCollection(collection) {
return new Promise(async (resolve, reject) => {
try {
const result = []
await collection.each(r => {
result.push(r)
})
return resolve(result)
} catch (err) {
return reject(err)
}
})
}
// then later, use our function
const projectIds = [1,2,3]
const records = await retrieveDexieCollection(db
.whateverYourTableIsCalled
.where('projectId')
.anyOf(projectIds))
如果您需要在执行过程中处理记录(我这样做了),您可以添加一个mappingFunction
参数,并在将其添加到数组之前对每个元素调用该参数。
该函数非常灵活,因为您可以传递任何Dexie集合;整个表或任意查询的结果。
发布于 2019-10-17 06:57:30
如果在一些大型数据集中使用Dexie的toArray()
方法,请尝试使用offset(number)
和limit(number)
限制记录的数量,以批量获取数据
https://stackoverflow.com/questions/52717593
复制相似问题