IndexedDB:未捕获(承诺)的DOMException

时间:2019-06-21 05:30:12

标签: javascript typescript indexeddb large-data

我正在使用indexedDB(通过npm的idb包装器)存储代表音频通道数据的2D Float32数组。它可以正常工作一段时间,但是,当其中一个数组的长度达到大约16658432时,idb会崩溃,标题中的异常除外。堆栈跟踪非常无用,因为我将React与Next.js结合使用,但是据我所知,它似乎在idb的缓存部分崩溃了。注意:我可以存储多个大数组没问题,但是一旦其中一个超出此“限制”,一切都会中断

这是我必须解决的一个限制,还是可以通过某种方式解决?我可能会将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);
  }
};

1 个答案:

答案 0 :(得分:0)

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