如何初始化一个非常大的数组的 Vec? [复制]

Posted

技术标签:

【中文标题】如何初始化一个非常大的数组的 Vec? [复制]【英文标题】:How to initialize a Vec of very large arrays? [duplicate] 【发布时间】: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 没有构造函数,我仍然必须将某些内容推送(即)复制到该内存中。

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

【问题讨论】:

【参考方案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();

【讨论】:

我建议将此答案移至(其中一个)链接副本。

以上是关于如何初始化一个非常大的数组的 Vec? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

非常大的 numpy 数组不会引发内存错误。它在哪里生活? [复制]

初始化一个非常大的熊猫数据框

创建非常大的numpy数组时出现MemoryError [重复]

CUDA 结果使用非常大的数组返回垃圾,但不报告错误

如何找到一个非常大的数组的余弦相似度

在 C++ 中初始化非常大的向量