pymongo批量写入执行非常慢

时间:2020-01-27 12:31:59

标签: python pandas mongodb pymongo batch-processing

我们有一个近100000条记录的数据框,我想在mongodb集合中进行向上插入。

下面是我的示例代码。

为了在下面的代码中保持简单,我在for循环中生成这些数据并附加lstValues。

在实际应用中,我们从外部csv文件接收这些数据,然后将其加载到pandas数据帧中。

我们从这些外部csv文件中接收了将近98000条记录。另外,我们最初的mongodb集合已经包含了将近1,00,00,00条记录,并且还在不断增加。

下面我只使用了几个字段,例如学习,姓名,等级,地址,电话和标准。但是在实际应用中,我们有将近200个这样的字段。

您可以看到我正在使用bulk_write函数批量更新我的收藏集。 我也试图将Bathc大小设为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)))

0 个答案:

没有答案