如何在不导致内存不足的情况下检索couchdb数据库中的所有文档



我有一个coucdb数据库,其中包含大约200000条推文,关键字是推文ID。我正在使用lightcouch在java网络应用程序中使用couchdb。如果我创建这样的dbClient:

List<JsonObject>tweets = dbClient.view("_all_docs").query(JsonObject.class);

然后循环浏览tweet,对于tweet中的每个JsonObject,使用

JsonObject tweetJson = dbClient.find(JsonObject.class, tweet.get("id").toString().replaceAll(""", ""));

为了一条接一条地检索每条推文,花了非常长的时间才检索到20万份文档。如果我使用includeDocs(true)在一个查询中加载所有文档

List<JsonObject>allTweets = dbClient.view("_all_docs").includeDocs(true).query(JsonObject.class);

由于文档数量过大,它导致内存外异常。那么我该如何处理这个问题呢?我正在考虑使用limit(5000)每次检索5000个文档,并在整个数据库中循环,但我不知道如何编写循环,以便在前5000个文档之后继续检索下5000个文档。一个可能的解决方案是使用startKey和endKey,但当密钥是tweet ID时,我不知道如何使用它们。

使用queryPage,但请确保使用字符串作为键请参阅:https://github.com/lightcouch/LightCouch/issues/26#event-122327174

0.1.6似乎仍然表现出这种行为。

我为此找到了一个变通方法:

    changes = DbClient.changes()
            .since(null) // or... since(since) if you want an offset
            .includeDocs(true);

    int size = 1;
    getCursor("0");
    while (size > 0 ) {  
        ChangesResult resultSet = changes.limit(40000).getChanges();
        List<ChangesResult.Row> rowList = resultSet.getResults();
        for (ChangesResult.Row feed: rowList) {
            <instantiate your object via gson>
        .
        .
        .
        }
        getCursor(resultSet.getLastSeq());
        size = rowList.size();
    }

最新更新