描述:
我正在开发一个项目,需要将超过 100 万条记录插入 Google Firestore。目前,我的方法效率还不够,而且过程极其缓慢。我正在寻找一种方法来优化这个过程。
我尝试过的:
batch writes
,但单个批次中可以执行的操作数量似乎有限制。当前代码:
const { Firestore } = require('@google-cloud/firestore');
// Initialize Firestore
const db = new Firestore();
// Data to insert (example)
const data = Array.from({ length: 1000000 }, (_, i) => ({
field1: `value${i}`,
field2: `value${i}`,
}));
// Individual insert
async function insertData() {
for (const item of data) {
await db.collection('my_collection').add(item);
}
}
insertData().then(() => {
console.log('Inserts completed');
}).catch(error => {
console.error('Error inserting data:', error);
});
问题:
对于如此大量的记录,上面的代码非常慢。我了解 Firestore 对每秒和每批次的操作数有限制,我想知道处理这种情况的最佳方法。
问题:
我很欣赏任何有助于提高 Firestore 批量插入性能的建议或代码示例。
您在这里几乎选择了最慢的方法,因为您对每个单独的写入操作都使用
await
。因此写入是按顺序执行的,而不是并行执行的。
为了提高性能,请通过删除当前拥有的
await
并将其替换为每 100 个文档左右的一个 await Promise.all(...)
来并行执行写入。有关示例,请参阅我的答案:使用 Firebase Cloud Functions 更新 Firestore 文档非常慢
另请参阅:将大量文档写入 Firestore 的最快方法是什么?
对于来自服务器端进程的批量写入操作,还可以考虑使用
BulkWriter
- 这通常比单个写入操作快很多。请参阅https://cloud.google.com/nodejs/docs/reference/firestore/latest/firestore/bulkwriter
我上面链接的“最快方式”答案是在我发现 BulkWriter 之前写的(或者在它事件存在之前?🤔)