【问题标题】:Reading documents from the Couchbase bucket as batches从 Couchbase 存储桶中批量读取文档
【发布时间】:2016-03-02 03:25:12
【问题描述】:

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

我需要分批处理文档,比如 1M/batch,将该批次推送到我的内存中,(对这些文档进行一些操作)并推送下一批。

我为读取特定数量的文档而编写的函数并不能确保它在再次调用时返回一组不同的文档。

有什么方法可以让我完成这个功能吗?我还有一个可以批量创建文档的功能。我不确定我是否可以编写一个可以批量读取文档的类似函数。函数如下。

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++);

        }

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 您的问题是关于批量阅读文档的问题,并且您已经发布了编写文档的代码。您要更新的 rx 代码看起来不错。如何发布您尝试批量加载的内容。
  • 问题是我不知道如何从服务器获取文档。 just 功能需要按键吗?我无权访问密钥。所以我无法编写类似的函数来读取文档。
  • 你不知道钥匙?忽略批处理,你打算如何指定你需要的文件。意见? N1QL?那些合适吗?你没有在问题中指定。我认为您可能应该更新问题以正确解释您的问题。
  • 我什至没有将 25M+ 密钥存储在应用层中。所以我只能选择使用limitskip 函数来使用视图。在发布这个问题时,我打算使用 rx 代码获取文档。

标签: java couchbase


【解决方案1】:

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

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

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

【讨论】:

  • 是的。就是那样。我什至找到了一种不会使用skip 函数的优化方法。您可以使用.startKey().startKeyDocId() 函数,它们不会对处理器造成太大的开销。我不确定 DCP 协议。它是如何工作的?
  • 您需要创建一个与 couchbase DCP 协议挂钩的小应用程序。这是内部 couchbase 协议,它不会对集群造成过载我建议您从视图开始。因为它一开始更容易实现。如果它不能按预期工作,请转到更复杂的解决方案。
  • 视图工作正常。我也可以使用多个线程来处理它。如果我开始遇到新问题,我会尝试这个选项!谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-01-20
  • 2021-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多