如何高效地将超过100万条记录插入Firestore?

问题描述 投票:0回答:1

描述

我正在开发一个项目,需要将超过 100 万条记录插入 Google Firestore。目前,我的方法效率还不够,而且过程极其缓慢。我正在寻找一种方法来优化这个过程。

我尝试过的

  1. 单独插入:我尝试使用循环一条一条地插入记录,但这非常慢。
  2. 批量写入:我尝试使用
    batch writes
    ,但单个批次中可以执行的操作数量似乎有限制。
  3. 适用于 Node.js 的 Firestore SDK:我一直在使用适用于 Node.js 的 Firestore SDK 来管理插入。

当前代码

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 的最佳实践是什么?
  • 如何优化流程以提高效率?
  • 我需要注意哪些具体限制以及如何克服它们?
  • 是否可以使用其他 Google Cloud 服务(例如 Pub/Sub 或 Dataflow)来解决此问题?如何将它们集成到批量插入流程中?

我很欣赏任何有助于提高 Firestore 批量插入性能的建议或代码示例。

node.js firebase google-cloud-firestore google-cloud-dataflow google-cloud-pubsub
1个回答
1
投票

您在这里几乎选择了最慢的方法,因为您对每个单独的写入操作都使用

await
。因此写入是按顺序执行的,而不是并行执行的。

为了提高性能,请通过删除当前拥有的

await
并将其替换为每 100 个文档左右的一个
await Promise.all(...)
来并行执行写入。有关示例,请参阅我的答案:使用 Firebase Cloud Functions 更新 Firestore 文档非常慢

另请参阅:将大量文档写入 Firestore 的最快方法是什么?


对于来自服务器端进程的批量写入操作,还可以考虑使用

BulkWriter
- 这通常比单个写入操作快很多。请参阅https://cloud.google.com/nodejs/docs/reference/firestore/latest/firestore/bulkwriter

我上面链接的“最快方式”答案是在我发现 BulkWriter 之前写的(或者在它事件存在之前?🤔)

© www.soinside.com 2019 - 2024. All rights reserved.