Как мы можем прочитать в примечании к этой ссылке о записи в Firestore:
Для массового ввода данных используйте клиентскую библиотеку сервера с распараллеленными отдельными записями. Пакетные записи работают лучше, чем сериализованные записи, но не лучше, чем параллельные записи. Для массовых операций с данными вы должны использовать серверную клиентскую библиотеку, а не мобильный / веб-SDK.
Я пытаюсь запрограммировать параллельные записи в Firestore с помощью Python 3.7 Облачной функции. Я никогда ничего не программировал параллельно в Python, поэтому я пытаюсь использовать некоторые модули, такие как joblib, чтобы попытаться распараллелить циклы. Но я не получаю быстрые записи (вероятно, я программирую это неправильно). Предположим, у меня есть данные, которые я хочу записать в Firestore в виде итеративного объекта «data». Я пытаюсь распараллелить что-то вроде этого:
for key in data:
doc_ref = db.collection(u'my_collection').document(key.id)
doc_ref.set({u'new_data': key.new_data})
Как мне добиться этого при параллельном вызове в Python 3.7 облачной функции?
РЕДАКТИРОВАТЬ Я пробовал это, используя многопроцессорность:
from google.colab import drive
import firebase_admin
from firebase_admin import credentials
from firebase_admin import firestore
import time
from multiprocessing import Pool
import multiprocessing
drive.mount('/content/drive/')
#Initialize Firestore client
cred = credentials.Certificate('/content/drive/My Drive/Colab Notebooks/my_credentials.json')
firebase_admin.initialize_app(cred)
db = firestore.client()
#I will omit some code here.
#I append data dictionaries to a list called "dict_all_users".
#I want to write all these dictionaries to Firestore
#Parallelized function:
def test(dict_all_users):
doc_ref = db.collection(u'my_collection').document(dict_all_users['user_id'])
doc_ref.set({u'data1': dict_all_users['data1'], u'data2': dict_all_users['data2']})
num_cores = multiprocessing.cpu_count()
p = Pool(num_cores)
start = time.time()
p.map(test,dict_all_users)
stop = time.time()
print(stop-start)
Предыдущий код занимал ~ 27 секунд, чтобы выполнить 500 записей. В другом коде с пакетной записью это заняло ~ 1 секунду.
Согласно упомянутым выше документам, параллельная запись выполняется быстрее, чем пакетная запись. Что я делаю не так?