首页 > 解决方案 > 与 go-driver 相比,mongodb-rust-driver 在查找和获取大量数据时表现不佳

问题描述

我有一个包含 85.4k 文档的数据库,平均大小为 4kb

我在 go 中编写了一个简单的代码,使用mongodb-go-driver从数据库中查找并获取超过 70k 的文档

package main

import (
  "context"
  "log"
  "time"

  "go.mongodb.org/mongo-driver/mongo"
  "go.mongodb.org/mongo-driver/mongo/options"
)

func main() {
  localC, _ := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb"))
  localDb := localC.Database("sampleDB")
  collect := localDb.Collection("sampleCollect")

  localCursor, _ := collect.Find(context.TODO(), JSON{
    "deleted": false,
  })
  log.Println("start")
  start := time.Now()

  var result []map[string] interface{} = make([]map[string] interface{}, 0)

  localCursor.All(context.TODO(), &result)

  log.Println(len(result))
  log.Println("done")
  log.Println(time.Now().Sub(start))
}

在大约 20 秒内完成

2021/03/21 01:36:43 start
2021/03/21 01:36:56 70922
2021/03/21 01:36:56 done
2021/03/21 01:36:56 20.0242869s

之后,我尝试使用mongodb-rust-driver在 rust 中实现类似的东西

use mongodb::{
  bson::{doc, Document},
  error::Error,
  options::FindOptions,
  Client,
};
use std::time::Instant;
use tokio::{self, stream::StreamExt};

#[tokio::main]
async fn main() {
  let client = Client::with_uri_str("mongodb://localhost:27017/")
    .await
    .unwrap();
  let db = client.database("sampleDB");

  let coll = db.collection("sampleCollect");
  let find_options = FindOptions::builder().build();

  let cursor = coll
    .find(doc! {"deleted": false}, find_options)
    .await
    .unwrap();

  let start = Instant::now();
  println!("start");

  let results: Vec<Result<Document, Error>> = cursor.collect().await;
  let es = start.elapsed();
  println!("{}", results.iter().len());
  println!("{:?}", es);
}

但是在发布版本上完成相同的任务花了将近 1 分钟

$ cargo run --release
    Finished release [optimized] target(s) in 0.43s
    Running `target\release\rust-mongo.exe`
start
70922
51.1356069s

我可以知道在这种情况下生锈的性能被认为是正常的还是我在生锈代码上犯了一些错误并且可以改进?

编辑

正如评论所建议的,这里是示例文档

标签: mongodbgorust

解决方案


这里的差异是由于 Rust 驱动程序中的一些已知瓶颈已在最新的 beta 版本 (2.0.0-beta.3) 中得到解决;因此,升级您的mongodb依赖项以使用该版本应该可以解决问题。

使用提供的示例文档的 10k 副本重新运行您的示例,我现在看到在我的机器上使用 Rust 的大约 3.75 秒和 Go 的大约 5.75 秒。


推荐阅读