Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.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/12.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
C#MongoDB.Driver.NET 5次查询速度慢_C#_Mongodb - Fatal编程技术网

C#MongoDB.Driver.NET 5次查询速度慢

C#MongoDB.Driver.NET 5次查询速度慢,c#,mongodb,C#,Mongodb,我已经转移到一个新的C#.NET Core 5应用程序,并注意到MongoDB.Driver(2.12.3)与PyMongo(Python)或KMongo(Kotlin)等替代程序之间存在一些显著的性能差异。我不是.NET或Mongo专家,但我已经排除了我想象中显而易见的东西。wellUid有一个索引,我已经验证了使用explain(通过MongoCompass)完成查询只需要10毫秒。我曾尝试将序列化删除到C#类,并使用BsonDocument作为序列化类,这导致了较差的性能。我想我已经排除了

我已经转移到一个新的C#.NET Core 5应用程序,并注意到MongoDB.Driver(2.12.3)与PyMongo(Python)或KMongo(Kotlin)等替代程序之间存在一些显著的性能差异。我不是.NET或Mongo专家,但我已经排除了我想象中显而易见的东西。wellUid有一个索引,我已经验证了使用explain(通过MongoCompass)完成查询只需要10毫秒。我曾尝试将序列化删除到C#类,并使用BsonDocument作为序列化类,这导致了较差的性能。我想我已经排除了所有指向服务器或查询问题的符号,这看起来更像是环境/序列化中的某些东西

.NET 5(C#) 请注意,我也尝试过使用查询选项查找以及修改批处理大小。没有任何东西能缩短请求的有效时间

    [Fact(DisplayName = "Time fetching KPI indeicators")]
    public void TestPerformance()
    {
        mongoClientSettings.ClusterConfigurator = cb => {
            cb.Subscribe<CommandStartedEvent>(e => {
                _testOutputHelper.WriteLine($"{e.CommandName} - {e.Command.ToJson()}");
            });
        };
        
        var mongoClient = new MongoClient(mongoClientSettings);
        var drilling = mongoClient.GetDatabase("drilling");
        var kpiOneMin = drilling.GetCollection<KPI>("kpiOneMin");
        
        for (var i = 0; i < 3; i++)
        {
            var watch = Stopwatch.StartNew();
            var kpis = kpiOneMin.Aggregate().Match(x => x.WellId == "ABC").ToList();
            watch.Stop();
            _testOutputHelper.WriteLine($"Iteration: {i+1}, Count: {kpis.Count}, Time Millis: {watch.ElapsedMilliseconds}");   
        }
    }
Python 输出

结果比使用MongoDriver的.NET5快49%、90%和92%

Kotlin 这是kotlin的例子,所有客户的情况都完全相同,但是基于时间增量,性能提高了40-80%。我尝试Kotlin是因为我想排除python序列化到字典的速度

val database = client.getDatabase("drilling")
val col = database.getCollectionOfName<KPI>("kpiOneMin")

repeat(3) { iteration ->
    var kpiCount: Int = 0;
    val timeInMillis = measureTimeMillis {
        val kpis = col.aggregate<KPI>(match(KPI::wellUid eq "ABC")).toList()
        kpiCount = kpis.size
    }
    println("Iteration: ${iteration + 1}, KPI Count: $kpiCount,  Time Millis: $timeInMillis")
}

结果是,使用MongoDriver时,其速度分别比.NET 5快28%、83%和83%。

只是想知道这种性能差异在您的用例中是否真的很重要。在大多数情况下,一种语言的实现速度是另一种语言的两倍可能并不重要。您是否经常进行耗时数秒的查询?这是一个很好的问题。我们正在一个更大的应用程序中工作,我们需要尽快提供timeseries数据。简单的2周请求实际上只针对一个实体,未来将有多个实体,对于分析数据的人来说,加载时间将大大减少50%以上。我的专业知识绝对是宽列数据存储(Cassandra、HBase、DynamoDB)而不是文档数据库,因此我们可能缺少一些ID等。首先尝试执行
drilling.GetCollection(“kpiOneMin”)这样驱动程序就不必将数据映射到
KPI
实例。看看这有什么不同。如果这没有改变任何事情,请尝试使用wait/async模式而不是
.ToList()
,因为驱动程序正在通过异步反模式进行同步,以保持后台的向后兼容性。您应该尝试在Benchmark.Net或控制台应用程序上运行此功能。不确定使用TestOutputHelper编写Line的成本是多少,而且您正在订阅CommandStart事件。建议将打印语句隔离在秒表循环之外。
if __name__ == '__main__':
    client = MongoClient(uri)
    pipeline = [{"$match": {"wellUid": "ABC"}} ]
                
    for i in range(3):
        v = client.drilling.kpiOneMin.aggregate(pipeline)
        start_time = time.time()
        list(v)
        print("--- %s seconds ---" % (time.time() - start_time))
--- 4.739964246749878 seconds ---
--- 3.357880115509033 seconds ---
--- 3.3460099697113037 seconds ---
val database = client.getDatabase("drilling")
val col = database.getCollectionOfName<KPI>("kpiOneMin")

repeat(3) { iteration ->
    var kpiCount: Int = 0;
    val timeInMillis = measureTimeMillis {
        val kpis = col.aggregate<KPI>(match(KPI::wellUid eq "ABC")).toList()
        kpiCount = kpis.size
    }
    println("Iteration: ${iteration + 1}, KPI Count: $kpiCount,  Time Millis: $timeInMillis")
}
Iteration: 1, KPI Count: 21152,  Time Millis: 5515
Iteration: 2, KPI Count: 21152,  Time Millis: 3484
Iteration: 3, KPI Count: 21152,  Time Millis: 3501