我有一个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();
}