2016-03-02 43 views
0

我有一個具有大約25M文檔的Couchbase集羣。我能夠順序讀取它們,並且我還有一個函數可以從數據庫中讀取特定數量的文檔。但是我的用例稍有不同,因爲我無法將所有25M文檔(每個文檔都很大)存儲在內存中。作爲批處理從Couchbase存儲桶讀取文檔

我需要處理批量的文件,說1M /批,推的那批我的記憶,(做這些文件的一些操作),並推下一批。

,我已經寫了閱讀的文件具體數量並不能保證它再次調用時返回一組不同的文件的功能。

有沒有辦法讓我可以完成這個功能?我也有一個可以批量創建文檔的功能。我不確定是否可以編寫類似的功能來批量讀取文檔。該功能如下。

public void createMultipleCustomerDocuments(String docId, Customer myCust, long numDocs) { 

     Gson gson = new GsonBuilder().create(); 
     JsonObject content = JsonObject.fromJson(gson.toJson(myCust)); 
     JsonDocument document = JsonDocument.create(docId, content); 
     jsonDocuments.add(document); 
     documentCounter++; 

     if (documentCounter == numDocs) { 
      Observable.from(jsonDocuments).flatMap(new Func1<JsonDocument, Observable<JsonDocument>>() { 
       public Observable<JsonDocument > call(final JsonDocument docToInsert) { 
        return (theBucket.async().upsert(docToInsert)); 
       } 
      }).last().toBlocking().single(); 

      documentCounter = 0; 
      //System.out.println("Batch counter: " + batchCounter++); 

     } 

有人可以幫助我嗎?

+0

你的問題是關於批量閱讀文檔,並且你已經發布了編寫文檔的代碼。你的rx代碼放大看起來不錯。如何發佈你嘗試批量加載的內容。 – Will

+0

問題是我無法知道如何從服務器獲取文檔。 「正義」功能需要按鍵嗎?我沒有訪問密鑰。所以我無法寫出類似的閱讀文檔的功能。 –

+0

你不知道鑰匙?忽略批處理,你打算如何指定你需要的文件。看法? N1QL?那些會合適嗎?你沒有在問題中指定。我想你可能應該更新問題來正確解釋你的問題。 – Will

回答

1

我想嘗試創造出包含所有文件,然後詢問與跳躍和限制圖的圖。 (可以使用.startKey()startKeyId()函數代替skip()來避免開銷。)

但是,請記住不要將該視圖保留在生產環境中,這將是cpu豬。

另一種選擇,使用DCP協議數據庫複製到您的應用程序。但它是更多的工作。

+0

是的。就是這個方法。我甚至找到了一個不會使用'skip'函數的優化方法。你可以使用'.startKey()'和'.startKeyDocId()'函數,這對處理器來說不會有太大的開銷。 我不確定DCP協議。它是如何工作的? –

+0

您需要創建一個鉤入couchbase DCP協議的小應用程序。 這是內部couchbase協議,它不具有過載集羣 上我建議你先從視圖。因爲起初實施起來要容易得多。如果它不能按需要工作,請轉到更復雜的解決方案。 –

+0

該視圖正常工作。我也可以使用多線程來處理它。如果我開始遇到新問題,請嘗試使用此選項!謝謝! –

相關問題