为了账号安全,请及时绑定邮箱和手机立即绑定

如何提高插入的写入速度,pymongo?

如何提高插入的写入速度,pymongo?

慕的地8271018 2023-10-11 22:53:59
我有以下代码将文档插入到 MongoDB 中,问题是它非常慢,因为我无法对其进行多处理器处理,并且考虑到我必须检查插入的每个文档是否已经存在,我相信不可能使用批量-插入。我想知道是否有更快的方法来解决这个问题。在进行下面的分析后,我发现check record()和update_upstream()是两个非常耗时的函数。因此优化它们会提高整体速度。任何有关如何优化以下内容的意见都将受到高度赞赏。谢谢你!import osimport pymongofrom directory import Directoryfrom pymongo import ASCENDINGfrom pymongo import DESCENDINGfrom pymongo import MongoClientfrom storage_config import StorageConfigfrom tqdm import tqdmdir = Directory()def DB_collections(collection_type):    types = {'p': 'player_stats',             't': 'team_standings',             'f': 'fixture_stats',             'l': 'league_standings',             'pf': 'fixture_players_stats'}    return types.get(collection_type)class DB():    def __init__(self, league, season, func=None):        self.db_user = os.environ.get('DB_user')        self.db_pass = os.environ.get('DB_pass')        self.MONGODB_URL = f'mongodb+srv://{self.db_user}:{self.db_pass}@cluster0-mbqxj.mongodb.net/<dbname>?retryWrites=true&w=majority'        self.league = league        self.season = str(season)        self.client = MongoClient(self.MONGODB_URL)        self.DATABASE = self.client[self.league + self.season]        self.pool = multiprocessing.cpu_count()        self.playerfile = f'{self.league}_{self.season}_playerstats.json'        self.teamfile = f'{self.league}_{self.season}_team_standings.json'        self.fixturefile = f'{self.league}_{self.season}_fixturestats.json'        self.leaguefile = f'{self.league}_{self.season}_league_standings.json'        self.player_fixture = f'{self.league}_{self.season}_player_fixture.json'        self.func = func    def execute(self):        if self.func is not None:            return self.func(self)def import_json(file):    """Imports a json file in read mode        Args:            file(str): Name of file    """    return dir.load_json(file , StorageConfig.DB_DIR)
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

您可以使用 将检查/插入/更新逻辑合并到单个update_one()命令中upsert=True,然后使用批量运算符,例如:


updates = []


for player in tqdm(playerstats):

    updates.append(UpdateOne({'p_id': player['p_id']}, player, upsert=True))


collection.bulk_write(updates)

最后,在 MongoDB shell 中使用以下命令检查您的索引是否正在使用:


db.mycollection.aggregate([{ $indexStats: {} }])

并查看 accesses.ops 指标。


查看完整回答
反对 回复 2023-10-11
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信