Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从mongoDB大容量读取_Java_Mongodb_Performance_Mongodb Query - Fatal编程技术网

Java 从mongoDB大容量读取

Java 从mongoDB大容量读取,java,mongodb,performance,mongodb-query,Java,Mongodb,Performance,Mongodb Query,我有一个简单的查询(没有任何where子句)。它返回大约150K个文档,每个文档大约有5个字段。要以JSON数组格式获取所有记录,大约需要5-6秒。单次请求的性能还可以,但我的代码是在Java RESTful服务中运行的。如果我发送10-15个请求,那么性能就会下降,现在需要一分钟以上的时间才能得到响应 在调查中,我使用find查询将批大小设置为5000。这样可以提高50%,但仍然不可接受 我正在使用MongoDB 3.4.4和Java驱动程序 下面是代码片段 BasicDBObject

我有一个简单的查询(没有任何where子句)。它返回大约150K个文档,每个文档大约有5个字段。要以JSON数组格式获取所有记录,大约需要5-6秒。单次请求的性能还可以,但我的代码是在Java RESTful服务中运行的。如果我发送10-15个请求,那么性能就会下降,现在需要一分钟以上的时间才能得到响应

在调查中,我使用find查询将批大小设置为5000。这样可以提高50%,但仍然不可接受

我正在使用MongoDB 3.4.4和Java驱动程序

下面是代码片段

    BasicDBObject attributes = new BasicDBObject();
    attributes.put("att1", 1);
    attributes.put("att2", 1);
    attributes.put("att3", 1);
    attributes.put("att4", 1);
    attributes.put("att5", 1);
    attributes.put("att6", 1);
    attributes.put("_id", 0);

    FindIterable<BsonDocument> dbResult = db.getCollection("mycollection", BsonDocument.class).find().batchSize(1000)
            .projection(attributes);

    StringBuilder sb = new StringBuilder("[");

    for (BsonDocument d : dbResult) {
        sb.append(d.toString());
        sb.append(",");
    }

    String result = sb.substring(0, sb.lastIndexOf(",")) + "]";

    JsonParser parser = new JsonParser();
    JsonArray jsonObject = (JsonArray) parser.parse(result);
BasicDBObject属性=新的BasicDBObject();
属性。put(“att1”,1);
属性。put(“att2”,1);
属性。put(“att3”,1);
属性。put(“att4”,1);
属性。put(“att5”,1);
属性。put(“att6”,1);
属性。放置(“\u id”,0);
FindTerrable dbResult=db.getCollection(“mycollection”,BsonDocument.class).find().batchSize(1000)
.投影(属性);
StringBuilder sb=新的StringBuilder(“[”);
for(BsonDocument d:dbResult){
某人附加(d.toString());
某人加上(“,”);
}
字符串结果=sb.子字符串(0,sb.lastIndexOf(“,”)+“]”;
JsonParser=新的JsonParser();
JsonArray jsonObject=(JsonArray)parser.parse(result);
我有以下问题

  • 如何找到优化的批量大小

  • 在MongoDB API中,我无法找到任何方法来获取批量数据,我只能看到可以返回游标的find方法,我必须逐个迭代所有文档。有没有办法让我进行批量阅读

  • 如果一个请求的性能很好,那么如果我同时请求,为什么性能会严重下降呢?是否有其他方法/参数可以为我优化性能


  • Annu

    这些请求是否加载相同的150K记录?否则,它们将争夺缓存空间,并可能导致大量磁盘I/O。设置
    batchSize
    与不设置一样好。这主要取决于硬件和网络功能,所以如果你想把大数字扔出去,那么你必须认真对待。而在一些不能达到你预期结果的事情上跑步也不是认真的。唯一其他实际需要做的事情是分割您的请求并写出数据的“范围”。但这在很大程度上是一般缩放主题的变化。@Thilo-我当前的测试是在每个请求中返回所有相同的150K记录。但是我希望我的程序能够处理mongodb查询返回相同或不同数量记录的两种情况。只是想知道这真的很重要吗?请说明mongodb运行的硬件。RAM、CPU、旋转磁盘还是SSD?操作系统?MongoDB运行机器上的其他进程?这些请求是否加载相同的150K记录?否则,它们将争夺缓存空间,并可能导致大量磁盘I/O。设置
    batchSize
    与不设置一样好。这主要取决于硬件和网络功能,所以如果你想把大数字扔出去,那么你必须认真对待。而在一些不能达到你预期结果的事情上跑步也不是认真的。唯一其他实际需要做的事情是分割您的请求并写出数据的“范围”。但这在很大程度上是一般缩放主题的变化。@Thilo-我当前的测试是在每个请求中返回所有相同的150K记录。但是我希望我的程序能够处理mongodb查询返回相同或不同数量记录的两种情况。只是想知道这真的很重要吗?请说明mongodb运行的硬件。RAM、CPU、旋转磁盘还是SSD?操作系统?MongoDB运行的机器上的其他进程?