操作系统: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/