У меня есть база данных coucdb, содержащая около 200000 твитов, ключи - идентификатор твита. У меня есть запрос, который должен получить все документы для поиска некоторой информации. Я использую lightcouch для работы с couchdb в веб-приложении Java. Если я создаю DBClient так:Как получить все документы в базе данных couchdb, не вызывая нехватки памяти
List<JsonObject>tweets = dbClient.view("_all_docs").query(JsonObject.class);
и затем петлю через твиты, для каждого JSONObject в твитов, используйте
JsonObject tweetJson = dbClient.find(JsonObject.class, tweet.get("id").toString().replaceAll("\"", ""));
получить каждый твит один за другим потребовалось очень много времени, 200000 документов , Если бы я загрузить все документы в одном запросе с использованием includeDocs (истинных)
List<JsonObject>allTweets = dbClient.view("_all_docs").includeDocs(true).query(JsonObject.class);
это вызвало OutOfMemory исключение, так как количество документов, слишком велики. Итак, как я могу справиться с этой проблемой? Я думаю об использовании limit (5000) для извлечения 5000 документов за каждый раз и цикла через всю базу данных, но я не знаю, как написать цикл, чтобы продолжить получать следующие 5000 после первых 5000 документов. Одним из возможных решений является использование startKey и endKey, но я смущен, как использовать их, когда ключ является идентификатором твита.
Используйте 'queryPage'. См .: http://www.lightcouch.org/lightcouch-guide.html#pagination – ssnobody
Как использовать queryPage? Вот что я сделал: Страница page = dbClient.view ("_ all_docs"). QueryPage (5000, null, JsonObject.class); а затем while: while (page.isHasNext()) {...}, но он выдает ошибку: ожидаемая строка, но была Begin_object –
keduadoi
Я не использовал ее сам, но https://github.com/daumproject/daum -extra/blob/master/org.daum.extra.android.lightcouch/src/main/test/CouchDbClientTest.java, похоже, имеет некоторый пример кода в функции 'testPagination', которая использует' queryPage' и 'isHasNext', которые могут быть полезно. – ssnobody