微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用actix-web + mongo编译应用程序会在Linux上耗尽内存

如何解决使用actix-web + mongo编译应用程序会在Linux上耗尽内存

我无法在Linux(Ubuntu 18 Bionic Beaver)上编译以下内容。我已经尝试了Docker和VirtualBox VM,但是rustc最终都耗尽了这两个内存。该代码在macOS上编译没有问题,并在Linux上编译到大约5天之前。

use {
    actix_web::{
        get,web::{self},App,HttpResponse,HttpServer,},mongodb::{
        options::{ClientOptions,StreamAddress},Client,Database,};

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    let options = ClientOptions::builder()
        .hosts(vec![StreamAddress {
            hostname: "localhost".into(),port: Some(27017),}])
        .build();
    let client = Client::with_options(options).unwrap();

    HttpServer::new(move || {
        App::new()
            .data(AppState {
                db: client.database("mydb"),})
            .service(hi)
    })
    .bind("localhost:3000")
    .unwrap()
    .run()
    .await;

    Ok(())
}

#[get("/hi")]
async fn hi(state: web::Data<AppState>) -> actix_web::Result<HttpResponse> {
    state.db.collection("mycoll").find(None,None).await;

    HttpResponse::Ok().await
}

struct AppState {
    db: Database,}

Cargo.toml中的依赖项:

[dependencies]
actix-rt = "1.1.1"
actix-web = "2.0.0"
mongodb = "1.1.0"

在上一个成功的CI构建和第一个开始失败的CI构建之间唯一改变的是在服务器上添加一个端点(本质上是现有副本的复制/粘贴),并且在服务器上创建了次要版本。时间箱(间接依赖)。检出最后一个有效的提交,并尝试构建不起作用的。

如果我删除await调用中的find(),它将在Linux上编译,但是如果我将find调用(使用await)也将编译。在非Actix async fn中。

如果我使用mongo的sync功能也可以,但这并不理想。

降级到Rust 1.45可以对其进行编译,因此显然1.46​​版本中的某些内容以某种方式破坏了actix或mongo条板箱。

由于此代码可在macOS上运行,并在上周在Linux上运行,因此我假设在像这样的Actix-web路由处理程序中使用Mongo并没有根本问题。我想念什么吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。