У нас есть фрейм данных почти из 100000 записей, которые я хочу сохранить в коллекции mongodb.
Мой пример кода приведен ниже.
Для простоты кода ниже, я генерируя эти данные в a для l oop и добавляя lstValues.
В реальном приложении мы получаем эти данные из внешних файлов CSV, которые мы загружаем в pandas dataframe.
Мы получаем почти 98000 записей из этих внешних файлов CSV. Кроме того, наша оригинальная коллекция mongodb уже содержит почти 1,00,00,00 записей и продолжает увеличиваться.
ниже я только что использовал несколько полей, таких как Studid, Name, Grade, Address, Phone и Std. Но в реальном приложении у нас есть почти 200 таких полей.
Вы можете видеть, что я использую функцию bulk_write для пакетного обновления моей коллекции. Также я пытаюсь сделать ванну c размером 1000 записей. Но тем не менее, приведенный ниже код занимает почти 20 минут или больше, чтобы подтвердить эти записи. У нас есть внешнее приложение, которое делает то же самое почти за 4 минуты. цель состоит в том, чтобы доказать способность Python выполнять пакетные операции такого типа с MongoDB. Не уверен, что делаю что-то не так в приведенном ниже коде? или это максимум, который python может выполнить с таким огромным набором данных?
Пожалуйста, посоветуйте, как я могу улучшить производительность моего кода ниже или любую альтернативу для достижения этого в Python?
from pymongo import MongoClient, ReplaceOne, InsertOne,DeleteOne
import pandas as pd
import time
import uuid
lstValues = []
for i in range(100000):
template = {'StudId': str(uuid.uuid1()) , 'Name':'xyz' + str(i), 'Grade':'A', 'Address':'abc', 'Phone':'0123', 'Std':'M1'}
lstValues.append(template)
bulklist = []
db = MongoClient(['server1:27017', 'server2:27018'],replicaset='rs_development',username='appadmin',password='abcxyz',authSource='admin',authMechanism='SCRAM-SHA-1')['TestDB']
starttime = time.time()
for m in lstValues:
bulklist.append(ReplaceOne(
{ "STUDENT.Grade": m['Grade'] , "STUDENT.Name": m['Name'] },
{'STUDENT': m },
upsert=True
))
if (len(bulklist) == 1000):
db.AnalyticsTestBRS.bulk_write(bulklist, ordered=False)
bulklist=[]
print("Time taken mongo upsert : {0} seconds".format((time.time() - starttime)))