【发布时间】:2014-07-03 23:40:47
【问题描述】:
我正在尝试在没有多线程的 macbook air 1.7GHz i7 上使用 PyMongo 将大约 8 亿条记录插入 MongoDB,文档的结构如下:
我正在阅读的记录是以下元组:
(user_id,imp_date,imp_creative,imp_pid,geo_id)
我正在根据正在读取的文件中的 user_id 创建自己的 _id 字段。
{_id:user_id,
'imp_date':[array of dates],
'imp_creative':[array of numeric ids],
'imp_pid':[array of numeric ids],
'geo_id':numeric id}
我正在使用带有 $push 的 upsert 来为相应的数组附加日期、广告 ID 和 pid
self.collection.update({'_id':uid},
{"$push":{'imp_date':<datevalue>,
'imp_creative':<creative_id>,
'imp_pid':<pid>}},safe=True,upsert=True)
我正在使用带有 $set 的 upsert 来覆盖地理位置(只关心最近的。
self.collection.update({'_id':uid},
{"$set":{'geo_id':<geo id>}},safe=True,upsert=True)
我每秒只写大约 1,500 条记录(如果我设置 safe=False,则为 8,000 条)。我的问题是:我该怎么做才能进一步加快速度(理想情况下是 20k/秒或更快)?
我找不到关于以下方面的明确建议的想法: - 使用多线程插入数据 -分片 -填充数组(我的数组增长非常缓慢,每个文档数组在文件末尾的平均长度约为 4) -关闭日记功能
抱歉,如果我遗漏了任何必要的信息,这是我的第一篇文章。
【问题讨论】:
-
恩里克在他的回答中有一些很好的建议。您是否也尝试过拆分批处理并在两个单独的连接/机器上运行它?我只是做了一个基本的测试,似乎这两个连接并没有减慢对方的速度。换句话说,线程可能会对您产生最显着的影响。