IndexedDB:未捕获(承诺)DOMException

IndexedDB: Uncaught (in promise) DOMException

我正在使用 indexedDB(通过 npm 的 idb 包装器)来存储表示音频通道数据的 2D Float32 数组。它在一段时间内工作正常,但是,当其中一个数组的长度达到大约 16658432 时,idb 崩溃,标题中出现异常。堆栈跟踪是非常无用的,因为我将 React 与 Next.js 结合使用,但是从我摸索出来的内容来看,它似乎在 idb 的缓存部分崩溃了。注意:我可以存储多个大数组没问题,但是一旦其中任何一个超过这个"limit"

,一切都会中断

这是我必须处理的限制,还是可以通过某种方式解决?我可能会将 2D 数组拆分为两个数组并将它们存储为单独的条目,但这是一个不太理想的解决方案,一旦它们增长也会导致同样的问题。

只是 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);
  }
};

我刚刚在 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

测试时间:

  • Google Chrome
  • 版本 76.0.3809.100(正式版)(64 位)