簡體   English   中英

100 字節的內存分配失敗

[英]memory allocation of 100 bytes failed

我有一些代碼需要創建一個大數組。 在我的本地計算機(OSX)上,程序運行正常。 但是,當我嘗試在 Ubuntu DigitalOcean droplet 上運行該程序時,出現以下錯誤:

memory allocation of 100 bytes failedAborted

輸出中沒有提供任何其他信息,但我認為這與初始化向量有關。

fn example() {
    let n = 25;
    let mut dp: Vec<Vec<f32>> = vec![vec![-1.0; n]; 2i32.pow(n as u32) as usize];
}

在某些情況下,該向量的大小可能會變得非常大。 有沒有更好的方法來創建這個大向量,或者這是由系統內存限制引起的?

您請求的 Vec 太大且內存不足。 當這種情況發生時,Rust 將中止程序。

分配 100 字節而不是 >3GB 的失敗令人驚訝,但這可能是因為 Linux 上的內存分配行為非常不直觀。 Linux 假裝有無限量的可用內存,並允許過大的分配(過度使用),直到它不能再虛張聲勢。

您可以通過使用try_reserve來緩解這種情況:

let mut vec = Vec::new();
let size = 2.pow(25);

// this may fail, but won't hard abort
vec.try_reserve(size)?; 

// now you can safely add up to the `size` to the vec
vec.resize(size, -1.0); 

fallible_collections crate 有更多針對Vec和其他的 OOM 處理方法。

要考慮的另一件事是使用cap分配器包裝器為 Rust 程序設置自己的內存使用硬限制。 這可以讓您避免對 Linux 的 OOM 殺手感到憤怒,並在程序分配成為機器范圍的問題之前限制它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM