别着急,坐和放宽
使用社交账号登录
使用drizzle+pglite时,进行大量数据插入时,会出现 RangeError: Maximum call stack size exceeded 报错,找了很多的相关内容,发现没多少相关解决方案,故有此文。
在 drizzle 的issues内可以找到 RangeError: Maximum call stack size exceeded on insert of large amount of rows,而关联的PR已很久没有更新,同时也没有被合并,保持为开启状态。
根据issue内的线索,定位到是drizzle内部调用的sql批量执行的实现问题,导致了大量条目批量执行时会出现问题。
因此,我们可以分多个chunk来插入:
export function* array2chunk<T>(data: readonly T[], size?: number) {
const MAX_PARAMETERS = Math.pow(2, 16) - 2;
const parametersPerRecord = data[0] ? Object.keys(data[0]).length : 1;
const maxSize = Math.floor(MAX_PARAMETERS / parametersPerRecord);
if (!size || size > maxSize) size = maxSize;
for (let i = 0; i < data.length; i += size) {
yield data.slice(i, i + size);
}
}
然后,在调用插入数据方法时使用for循环分chunk进行:
for (const rows of array2chunk(data, 2340))
await that.$db.insert(oneTable).values(rows);
这里解释2340的大小:本来根据issue的内容,上面的array2chunk生成器函数已经实现了最大可用size的计算,但是根据实际实验表明,2340是极限可用值;再往上会出现2种不同报错。
该处代码实现应用于我的弹幕转换库 @dan-auni/dan-any
您可以通过修改这里定义的值,然后运行仓库的vitest测试,查看报错信息。