2010-09-07 22 views
7

Mi chiedevo se in C# esiste una struttura che può contenere più della restrizione di Int.MaxValue di 2.147.483.647 elementi, in caso di serie di informazioni veramente grandi. Questo dovrebbe essere fatto con array a più livelli? O potresti creare un array che abbia una lunghezza massima di Long.MaxValue? Se é cosi, come?Array C# con capacità superiore a Int.MaxValue

+7

Se stai pensando di creare array di queste dimensioni, dovresti riconsiderare il tuo approccio. –

+1

Stai cercando di costruire il prossimo Twitter? – BoltClock

+0

Gli array multilivello potrebbero fare il trucco, ma c'è il rischio di esaurire la memoria. A cosa ti serve? – devnull

risposta

6

E 'stato fatto, un esempio BigArray<T> implementazione is here.

+0

Fantastico! Grazie per avermi dato il link a questo! –

1

molto piccoli computer avrà abbastanza memoria per contenere tale struttura in memoria.

+0

Non è più vero. – SLaks

+0

@SLaks, quindi forse dovrei aggiungere: pochissimi computer gestiranno tale struttura in memoria. –

+0

'readonly privato int [] _arrInts = new int [IntMax];' genera un 'System.OutOfMemoryException'. Dove 'private const int IntMax = int.MaxValue;'. Qualche idea del perché? – barnes

-2

ArrayList può contenere più di Int.MaxValue.

+7

No, non può, perché il costruttore prende solo un numero intero per la capacità e quindi non può essere superiore a Int32.MaxValue –

+3

@Richard: la logica non è * completamente * sana, poiché la capacità aumenta automaticamente. Potresti fornire 'int.MaxValue' e quindi aggiungere altri elementi. Sono abbastanza sicuro che ArrayList continuerebbe a fallire, ma non solo perché non è possibile specificare la capacità * finale * del costruttore come la capacità * iniziale *. –

2

È possibile utilizzare una struttura basata su indice solo se l'indicizzatore era un long (int64) anziché uno int32.

Anche un List non funziona poiché l'indicizzatore è un int32.

+0

Sì, questo è quello che pensavo ... oh, beh, sembra che ho bisogno di ridurre le informazioni. –

3

Qual è il tuo requisito? È difficile credere che una matrice con più elementi di questa sarà la soluzione corretta per qualsiasi problema del mondo reale, indipendentemente dal fatto che sia legale o meno. Potresti pensare a un database qui, sia permanente che in memoria. Questo è il mezzo standard per l'organizzazione di set di dati molto grandi.

3

Attualmente il CLR ha un limite di 2 GB per ogni singolo oggetto, quindi sarà necessario costruirlo da più array, anche per un tipo di elemento di byte. Quello dovrebbe essere fattibile comunque. La maggior parte delle normali interfacce di raccolta fallirebbe come usano int per l'indice, conta ecc

Io credo il CLR in sé non è limitata a un limite complessivo processo che impedirebbe questo - anche se aveva quasi certamente voglio essere in esecuzione su un CLR e OS a 64 bit, ovviamente.

+1

Che è tutto un po 'strano dato che c'è un sovraccarico di GetValue su System.Array che richiede molto tempo indicando che potresti avere array di dimensioni maggiori (http: // msdn.microsoft.com/en-us/library/2zexc3z9.aspx) –

+1

@Rune: Sì, sono d'accordo che è molto strano. Un po 'di design prematuro, potenzialmente. –

+1

@LukeH - sì e questa è la parte strana quando non aggiungono nulla (tranne che per ingannare lo sfortunato) perché aggiungerli del tutto. Aggiungerli quando sarebbero effettivamente supportati non sarebbe un cambiamento sostanziale. (Rimuovendoli ovviamente non sarebbe) –