Параллельная запись в Firestore с использованием облачной функции Python 3.7 - PullRequest
0 голосов
/ 27 апреля 2020

Как мы можем прочитать в примечании к этой ссылке о записи в 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 секунду.

Согласно упомянутым выше документам, параллельная запись выполняется быстрее, чем пакетная запись. Что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...