有效地遍历大型MongoDB集合

时间:2019-11-22 05:03:49

标签: java mongodb multithreading parallel-processing bloom-filter

我正在编写一个大型数据读取器,该读取器在mongodb内部创建了将近5000万个文档,并且还在不断增加(每天增加200万个)。基本上为了将数据存储到mongodb中,我需要首先检查记录是否已经存在。为此,我结合使用Redis和Bloom过滤器。因为Bloom筛选器完全在内存中,所以我每次程序启动时都需要加载它,这给我带来了麻烦。

当前,我使用迭代器(mongo游标)来迭代存储在特定mongo集合内的每个文档。这是一个示例:

private final static MongoDatabase database = client.getDatabase(Constants.MONGO_SCHEMA_NAME);
private final static MongoCollection collection = database.getCollection(Constants.MONGO_SITE_COLLECTION_NAME);

public void load(){
    MongoCursor cursor = collection.find().iterator();
    while(cursor.hasNext()){
        Document document = (Document)cursor.next();
        if(document != null){
            Filters.add(document.get(Constants.MONGO_ELEMENT_URL_FIELD_NAME).toString());
        }
    }
}

其中add是调用此函数以将URL添加到Redis和Bloom过滤器的函数。我同时使用Redis和Bloom过滤器,因为Bloom过滤器比Redis更快,而Redis比Mongo更快。这保证了我永远不必搜索mongo来查看文档是否已经存在(据我了解,这比redis慢得多)

我想知道是否可以暂时“拆分”一个集合或创建多个游标以通过并行处理来遍历该集合,以加快加载过滤器(Redis和Bloom Filter)所花费的时间。因此,理想情况下,不是从A-> Z中读取集合,而是理想地使用26个游标来同时读取A-> B和B-> C和...以及M-> N和...和Y-> Z。

谢谢! :)

1 个答案:

答案 0 :(得分:0)

这不是适合的方法。有两种更好的选择:

1:无需检查记录是否已存在或不想在不想复制的一个或多个字段上创建唯一索引

2:创建要检查的索引,它将极大地提高查询速度,但是插入和更新将花费更多时间。