操作系统:Mac OS Catalina v 10.15.1

Python 版本:Python 3.7.1

我使用 Firestore 作为我的数据库,用于使用 Python SDK 的个人项目。我目前正在尝试优化我的后端,我注意到写入 Firestore 的速度非常慢。以下面的示例代码为例:

import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import time


cred = credentials.Certificate("./path/to/adminsdk.json")
firebase_admin.initialize_app(cred)
db = firestore.client()

test_data = {f"test_field_{i}":f"test_value_{i}" for i in range(20)}

now = time.time()
db.collection(u'latency_test_collection').document(u'latency_test_document').set(test_data)
print(f"Total time: {time.time()-now}")

上面的代码需要>300ms 才能运行,这看起来很慢,特别是当我有比上面的例子大得多的多次写入时。我检查了我的互联网连接,无论连接如何,性能都在这个值附近徘徊。 Firestore 写入的这种性能是预期的,还是有一种方法可以为此优化我的代码?

最佳答案

一般来说,这不是一个很好的例子,因为你只写了一个文档。写入单个文档的延迟可能是 3000 毫秒,下一个理论上可能是 1 毫秒。开发一个写入多个文档的测试,并计算这些写入的平均时间。还要记住,如果文档 ID 相邻,则写入连续文档会降低性能。这就是为什么你应该选择一个随机的文档 ID 或某种散列。

import uuid
from google.cloud import firestore_v1

count = 20
data = [{f"test_field_{i}":f"test_value_{i}"} for i in range(count)]

now = time.time()
db = firestore_v1.Client()
coll = db.collection(u'latency_test_collection').

for record in data:
    coll.document(uuid.uuid4().hex).set(record)

print(f"Average time: {(time.time() - now)/count)}")

但是请记住,将大量单个记录/文档写入 firestore 时,您仍然受到 firestore api 速度的限制。有两种方法可以克服这个问题。第一个是异步编写文档。通过这种方式,您可以一次处理多个写入,但这可能非常昂贵,因为您需要为每次调用 firestore 的 api 付费。写入多个记录/文档的另一种(首选)方法是进行批处理操作,如下所示。请记住,在撰写本文时,写入的最大批量大小为 500。
import uuid
from google.cloud import firestore_v1

count = 20
data = [{f"test_field_{i}":f"test_value_{i}"} for i in range(count)]

now = time.time()
db = firestore_v1.Client()
coll = db.collection(u'latency_test_collection').
batch = db.batch()

for idx, record in enumerate(data):
    doc_ref = coll.document(uuid.uuid4().hex)
    batch.set(doc_ref, record)

    # Max batch size is 500
    if idx % 500 == 0:
        batch.commit()

if idx % 500 != 0
    batch.commit()

print(f"Total time: {(time.time() - now)/count)}")

关于python - Firestore 数据库写入的性能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60014638/

10-17 02:30