mongodb - 与 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
我可以知道在这种情况下生锈的性能被认为是正常的还是我在生锈代码上犯了一些错误并且可以改进?
编辑
正如评论所建议的,这里是示例文档
解决方案
这里的差异是由于 Rust 驱动程序中的一些已知瓶颈已在最新的 beta 版本 (2.0.0-beta.3) 中得到解决;因此,升级您的mongodb
依赖项以使用该版本应该可以解决问题。
使用提供的示例文档的 10k 副本重新运行您的示例,我现在看到在我的机器上使用 Rust 的大约 3.75 秒和 Go 的大约 5.75 秒。
推荐阅读
- vba - 如何在 Visio VBA 中绘制圆角矩形?
- ios - 如何根据 UIImage 大小调整 UIImageView 的大小并适合屏幕的宽度
- css - React Bootstrap:行列的垂直对齐?
- python - 在python字典中按值分组键/值对,保持原始键关联
- jdbc - Tibco Service JDBC SQL 部署问题
- java - 标签是否是 Java 语句?
- python - 如何使用 Prometheus 存储 Grafana 可视化的数据
- javascript - nodejs和angularjs有关系吗?
- php - 自定义 WordPress 搜索查询忽略 pre_get_posts 上的 posts_per_page
- powershell - Powershell ISE 功能缓存,如何去掉?