IndexedDB:未捕获(在承诺中)DOMException

wkyowqbh  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(284)

我正在使用indexedDB(通过npm的idb Package 器)来存储表示音频通道数据的2D Float32数组。它在一段时间内工作正常,但是,当其中一个数组的长度达到大约16658432时,idb崩溃,标题中出现异常。堆栈跟踪非常无用,因为我将React与Next.js结合使用,但是从我所看到的来看,它似乎在idb的缓存部分崩溃。注意:我 * 可以 * 存储多个大型数组没有问题,但一旦其中任何一个超过这个“限制”,一切都会崩溃
这是一个我必须处理的限制,还是可以通过某种方式解决?我可以将二维数组拆分为两个数组,并将它们存储为单独的条目,但这不是一个理想的解决方案,一旦它们也增长,将导致同样的问题。
只是一个简单的 Package 器围绕idb的事务:

export const asyncPut = async (
  dbName: string,
  tableName: string,
  key: string,
  value: any // [Float32Array, Float32Array]
): Promise<void> => {
  try {
    const db = await asyncOpenDb(dbName, tableName);
    const transaction = db.transaction(tableName, "readwrite");
    await transaction.objectStore(tableName).put(value, key);
  } catch (error) {
    // I catch the error here
    console.error("**IDB Error:", error);
  }
};
wfveoks0

wfveoks01#

我刚刚在Chrome中测试了这个,他们可能已经改进了错误,因为你已经测试。
当我尝试插入这个数组时,出现错误:

ar = new Array(16658432).fill(1)

它超过了单个对象的最大大小:

target: IDBRequest
error: DOMException
code: 0
message: "The serialized keys and/or value are too large (size=515354750 bytes, max=133169152 bytes)."
name: "UnknownError"
__proto__: DOMException

测试地点:

  • 谷歌浏览器
  • 版本76.0.3809.100(正式版本)(64位)

相关问题