2015-06-18 17 views
5

Nella mia ricerca per i numeri primi, ho già fatto questa domanda: Can't create huge arrays che mi portano a creare la mia propria classe di array falsi basa su un dizionario di array ...: private Dictionary<int, Array> arrays = new Dictionary<int, Array>();Creare enorme dizionario

posso sanno creare array falsi di un sacco di bool (come 10 000 000 000) usando il codice seguente:

public class CustomArray 
{ 
    private Dictionary<int, Array> arrays = new Dictionary<int, Array>(); 

    public CustomArray(ulong lenght) 
    { 
     int i = 0; 
     while (lenght > 0x7FFFFFC7) 
     { 
      lenght -= 0x7FFFFFC7; 
      arrays[i] = new bool[0x7FFFFFC7]; 
      i++; 
     } 
     arrays[i] = new bool[lenght]; 
    } 
} 

Ma si blocca non appena chiedo un CustomArray di 100 000 000 000 elementi. Funziona bene per le prime 25 iterazioni (il mio dizionario contiene 25 matrici di elementi 0x7FFFFFC7) ma poi si blocca con un'eccezione OutOfMemory.

Per il resto, ho 16 GB di memoria, VS2013, il programma è compilato a 64 bit, ho abilitato l'opzione gcAllowVeryLargeObjects e non vedo alcun picco di memoria nel Task Manager.


Come posso evitare questo errore?

+0

Perché dizionari di tutte le cose? Non sarebbe più appropriato un array frastagliato? – Luaan

+0

@Luaan scelta casuale, ero in vena di dizionario ... –

+3

anche bool non è un tipo efficiente per la memorizzazione delle informazioni. Potresti semplicemente archiviare 64 bool in un ulong (8 byte) piuttosto che in un 64 bool array (64 byte) – Andrew

risposta

7

100000000000 bool significa ~ 93 GB di memoria. Hai solo @ 50 GB (inclusa la memoria virtuale allocata predefinita).

Memorizzarli come bit (non come byte), porterebbero a ~ 12 GB.

Vedere System.Collection.BitArray

+0

Sembra buono - Lo proverò –

Problemi correlati