花费数小时来迭代3亿个mongo db记录

时间:2014-07-09 08:49:21

标签: mongodb mongo-java

我正在使用mongo java API从mongo slave迭代整个mongo文档。 Mongo Server:2.4.10 奴隶的记录数:3亿。 我有一个mongo大师,一个mongo奴隶。 (没有完成分片)

mongo奴隶每10秒复制一次非常高频率的2000次插入和删除。

迭代需要超过10个小时。 我的目标是获取集合中的每条记录并创建一个csv并将其加载到redshift。

DB db = null;
DBCursor cursor = null;
mongo = new MongoClient(mongoHost);
mongo.slaveOk();
db = mongo.getDB(dbName);
DBCollection dbCollection = db.getCollection(dbCollectionName);
cursor = dbCollection.find();

while (cursor.hasNext()) {
    DBObject resultObject = cursor.next();
    String uid = (String) ((Map) resultObject.get("user")).get("uid");
    String category = (String) resultObject.get("category");
    resultMap.put(uid, category);

    if (resultMap.size() >= csvUpdateBatchSize) {
        //store to a csv - append to an existing csv
    }

}

有没有办法将迭代时间缩短到1小时以下? 基础设施的变化也可以做到。就像增加分片一样。 请建议。

1 个答案:

答案 0 :(得分:0)

您是否考虑过对您的收藏品执行并行mongoexport? 如果您有办法使用查询对数据进行分区(类似于id或索引字段的模数),并将其作为标准输入传递给程序。

然后,您的程序将每个文档作为JSON行处理,您可以使用GSON或其他类似的库加载到表示文档结构的指定对象。 并最终在该对象上运行您的逻辑。

使用mongoexport并添加并行性可以极大地提高您的性能。