Json 如何通过多处理将许多文档(1亿)插入到本地mongodb?

Json 如何通过多处理将许多文档(1亿)插入到本地mongodb?,json,python-3.x,mongodb,multiprocessing,pymongo,Json,Python 3.x,Mongodb,Multiprocessing,Pymongo,我成功地将许多JSON文件(仅选择键)插入到本地MongoDB。然而,当一个集合有略多于1亿行需要插入时,我的代码似乎太慢了。我希望多重处理将有助于加快这一过程,但我不能想出正确的方法来做到这一点,没有任何冲突。以下是我的代码,无需进行多重处理: import json import os from pymongo import MongoClient client = MongoClient('localhost', 27017) db = client[db_name] # get

我成功地将许多JSON文件(仅选择键)插入到本地MongoDB。然而,当一个集合有略多于1亿行需要插入时,我的代码似乎太慢了。我希望多重处理将有助于加快这一过程,但我不能想出正确的方法来做到这一点,没有任何冲突。以下是我的代码,无需进行多重处理:

import json
import os

from pymongo import MongoClient

client = MongoClient('localhost', 27017)
db = client[db_name]


# get file list
def log_list(log_folder):
    log_file = list()
    for entry in os.listdir(log_folder):
        if os.path.isfile(os.path.join(log_folder, entry)):
            log_path = os.path.join(log_folder, entry)
            log_file.append(log_path)
    return log_file


def func():
    collection = db[collection_name]
    print('loading folder_name')
    root = folder_path
    nfile = 0
    nrow = 0
    # insert data
    files = log_list(root)
    files.sort()
    for file in files:
        with open(file, 'r') as f:
            nfile += 1
            table = [json.loads(line) for line in f]
        for row in table:
            nrow += 1
            entry = {'timestamp': row['@timestamp'], 'user_id': row['user']['id'], 'action': row['@type']}
            collection.insert_one(entry).inserted_id
    client.close()
    print(nfile, 'file(s) processed.', nrow, 'row(s) loaded.')

我们在我们的项目中这样做,用户为一些任务上传很多文件,我们使用芹菜的分布式任务队列来处理它

由于这是一个类似的异步任务,“芹菜”在这里可以做得很好,所以它被设计为拾取任务,然后在单独的过程中执行

  • 创建任务
  • 建立一个经纪人(比如redis)
  • 在另一个终端或后台运行芹菜
  • 发送任务(请参阅任务\u name.apply\u async()或任务\u name.delay())

  • 将文件拆分为多个文件。为文件的每个块运行一个程序副本。写入数据库时,使用而不是
    插入一个
    ,以更有效地写入数据库

    您可以使用Python来分叉多个并行作业