从Couchbase存储桶中读取文档作为批处理

时间:2016-03-02 03:25:13

标签: java couchbase

我有一个Couchbase集群,它有大约2500万个文档。我能够按顺序读取它们,并且我还有一个可以从数据库中读取特定数量文档的函数。但是我的用例略有不同,因为我无法将所有25M文档(每个文档都很大)存储在内存中。

我需要批量处理文档,比如说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++);

        }

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:1)

我会尝试创建一个包含所有文档的视图,然后使用skip和limit查询视图。 (可以使用.startKey()startKeyId()函数代替skip()来避免开销。)

但是,请记住不要将该视图保留在生产环境中,它将是cpu hog。

另一种选择,使用DCP协议将数据库复制到您的应用程序中。但这是更多的工作。