【问题标题】:How to initialize a Vec of very large arrays? [duplicate]如何初始化一个非常大的数组的 Vec? [复制]
【发布时间】:2017-12-20 13:33:36
【问题描述】:

我需要创建一个巨大的 NxN 数组。简单的数组是在堆栈上创建的,所以那里没有成功。静态数组必须是 constunsafe mut,所以这不是。

我试过Boxing 那个数组:

const N: usize = 1000000;
let mut boxed: Box<[usize; N]> = Box::new([0; N]);
boxed[1] = 1;

但这无论如何都会溢出堆栈,大概是因为它创建了一个临时数组,然后将其复制到Box

我尝试了Vec 的数组:

const N: usize = 1000000;
let mut v = Vec::<[usize; N]>::with_capacity(10);

v.push([0; N]);

结果相同。据我了解with_capacity 只分配内存;由于 Rust 没有构造函数,我仍然必须将某些内容推送(即)复制到该内存中。

那么,在不每晚进行安置新的情况下,这样做的正确方法是什么?

【问题讨论】:

    标签: arrays rust


    【解决方案1】:

    您可以在具有更大堆栈大小的专用线程中执行此操作:

    use std::thread;
    
    fn main() {
        const N: usize = 10000000;
    
        let builder = thread::Builder::new().name("reductor".into()).stack_size(
            1024 * 1024 *
                1024,
        );
    
        let handler = builder
            .spawn(|| {
                let mut v = Vec::<[usize; N]>::with_capacity(10);
                v.push([0; N]);
    
                println!("{:?}", v[0][0]);
            })
            .unwrap();
    
        handler.join().unwrap();
    }
    

    【讨论】:

    • 我建议将此答案移至(其中一个)链接副本。
    猜你喜欢
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2013-03-01
    • 2016-07-15
    • 2012-08-03
    • 2018-12-13
    • 2021-06-08
    相关资源
    最近更新 更多