2014-09-11 2 views
0

У меня есть база данных 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, но я смущен, как использовать их, когда ключ является идентификатором твита.

+0

Используйте 'queryPage'. См .: http://www.lightcouch.org/lightcouch-guide.html#pagination – ssnobody

+0

Как использовать queryPage? Вот что я сделал: Страница page = dbClient.view ("_ all_docs"). QueryPage (5000, null, JsonObject.class); а затем while: while (page.isHasNext()) {...}, но он выдает ошибку: ожидаемая строка, но была Begin_object – keduadoi

+0

Я не использовал ее сам, но https://github.com/daumproject/daum -extra/blob/master/org.daum.extra.android.lightcouch/src/main/test/CouchDbClientTest.java, похоже, имеет некоторый пример кода в функции 'testPagination', которая использует' queryPage' и 'isHasNext', которые могут быть полезно. – ssnobody

ответ

0

Использование 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(); 
    } 
Смежные вопросы