2017-07-15 3 views
0

Ich muss ein großes NxN-Array erstellen. Einfache Arrays werden auf dem Stack erstellt, also kein Erfolg. Statische Arrays müssen const oder unsafe mut sein, das ist also ein Nein.Wie initialisiert man einen Vec von sehr großen Arrays?

Ich versuchte Box das Array ing:

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

Aber das überläuft den Stapel wie auch immer, vermutlich, weil es ein temporäres Array erstellt, die dann in eine Box kopiert wird.

Ich habe versucht, ein Vec von Arrays:

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

v.push([0; N]); 

mit dem gleichen Ergebnis. So weit ich verstehe with_capacity reserviert nur Speicher; Da Rust keine Konstruktoren hat, muss ich immer noch etwas in diesen Speicher kopieren (d. h.).

Also, was ist der richtige Weg, dies zu tun, ohne für die Platzierung neu zu gehen?

Antwort

0

Man könnte es in einem eigenen Thread tut mit einer größeren Stack-Größe:

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(); 
} 
+0

Ich würde vorschlagen, diese Antwort zu (einer) die verknüpften Duplikate zu bewegen. – Shepmaster

Verwandte Themen