pymon go массовая запись выполняется очень медленно - PullRequest
0 голосов
/ 27 января 2020

У нас есть фрейм данных почти из 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)))
...