gpt4 book ai didi

python - PyMongo 插入具有约 100M 记录的极其缓慢的数据库

转载 作者:行者123 更新时间:2023-12-01 02:31:18 25 4
gpt4 key购买 nike

我在 MongoDB 中插入速度非常慢(大约 200 秒/插入),但我完全不知道为什么。

我有一个包含匿名用户名(整数)、匿名评论 ID(整数)和评论的 CSV 文件。所有这些都作为字符串读取,但前两个字段可以毫无问题地转换为整数。

数据库包含 100M 记录的集合,现在正在尝试构建用户及其评论 ID 的映射,并将其写入另一个集合中。大约有 6 万个用户发布了 1 亿条评论。即为每个用户构建 user_id = [comment_id0,...,comment_idN] 并将其插入数据库以便更快地获取所有用户评论。

def save_user_comments(dataset):
usrs = defaultdict(list)
updatebar = tqdm(total = 100000000, desc = 'Generating user-comment map', leave = False)
pool = mp.Pool()

for i, (user_id, comment_id, _) in enumerate(dataset):
usrs[str(user_id)].append(comment_id)
updatebar.update(1)

prev = 0
keys, vals = list(usrs.keys()), list(usrs.values())
results = pool.map_async(write_user, zip(keys, vals)).get()

progbar = tqdm(total = 67377, desc = 'Users Inserted', leave = False )
def write_user(itempair):
usr, comments = itempair

db = MongoClient(host = some_ip, port = some_port).GenderSpectrum
table = db.user

if db.user.find_one({'user_id': str(usr)}):
progbar.update(1)
return

u_obj = {}
obj = db.data.find_one({'user_id': str(usr)})

u_obj['comment_ids'] = comments
u_obj['_id'] = str(usr)
u_obj['is_female'] = obj['is_female']
u_obj['user_id'] = str(usr)
db.user.insert_one(u_obj)
progbar.update(1)
return 1

我在这段代码中看到的唯一会减慢速度的事情是为每个插入创建一个新连接。然而,尝试使用一个连接(使用单文档和多文档插入)批量插入 500 个文档时速度甚至更慢。依次运行此代码也是如此。

有人有更好的建议吗?

MongoDB 版本:v3.4.9

PyMongo 版本:3.5.1

Python版本:3.5.3

操作系统:Ubuntu 17.4

最佳答案

插入本身可能非常快,循环的其他部分似乎可能很慢。如果“user_id”没有被索引,那么这可能是最慢的部分:

db.data.find_one({'user_id': str(usr)})

在“数据”集合中的 user_id 上创建索引。只需执行一次:

db.data.create_index([('user_id', 1)])

这可能需要几分钟,之后“find_one”会快得多。

您还为每个插入创建一个新的 MongoClient,这也会使您的代码速度减慢一点。在程序运行期间创建一次 MongoClient:将其声明为全局变量,而不是“write_user”函​​数中的局部变量。

关于python - PyMongo 插入具有约 100M 记录的极其缓慢的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46801449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com