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

如何在不造成内存不足的情况下检索couchdb数据库中的所有文档,couchdb,out-of-memory,tweets,Couchdb,Out Of Memory,Tweets,我有一个coucdb数据库,其中包含大约200000条推文,关键是推文ID。我有一个查询,需要检索所有文档以查找一些信息。我正在使用Lightcoach在java web应用程序中与couchdb一起工作。如果我创建一个dbClient,如下所示: List<JsonObject>tweets = dbClient.view("_all_docs").query(JsonObject.class); changes = DbClient.changes()

我有一个coucdb数据库,其中包含大约200000条推文,关键是推文ID。我有一个查询,需要检索所有文档以查找一些信息。我正在使用Lightcoach在java web应用程序中与couchdb一起工作。如果我创建一个dbClient,如下所示:

List<JsonObject>tweets = dbClient.view("_all_docs").query(JsonObject.class);
    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();
    }
要一条一条地检索每条tweet,需要花费非常长的时间来检索200000个文档。如果我使用includeDocstrue在一个查询中加载所有文档

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

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

使用queryPage,但确保使用字符串作为键 见:

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

我找到的解决方法如下:

List<JsonObject>tweets = dbClient.view("_all_docs").query(JsonObject.class);
    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();
    }

使用查询页面。请参阅:如何使用queryPage?我就是这么做的:Page=dbClient.view\u all\u docs.querypage 5000,null,JsonObject.class;然后while循环:whilepage.isHasNext{…}但是它抛出了一个错误:预期的字符串但是是Begin_objectI本人没有使用它,但是在函数testPagination中似乎有一些示例代码使用queryPage和isHasNext,这可能会有所帮助。