Domanda

A quanto mi risulta ci sia un limite di 2 GB su singoli casi in .NET. Non ho prestato molta attenzione a questo dato che ho lavorato principalmente sul 32 bit OS finora. Su 32 ma è più o meno una limitazione artificiale comunque. Tuttavia, sono stato molto sorpreso di apprendere che questa limitazione si applica anche su 64 bit NET .

Poiché collezioni come List<T> utilizzare una matrice per memorizzare gli elementi, che significa che un NET esecuzione su 32 bit sarà in grado di contenere un numero doppio di tipo articoli riferimento in un elenco rispetto alla stessa applicazione in esecuzione su 64 bit. Questo è abbastanza sorprendente IMO.

Qualcuno sa se questa limitazione è indirizzato a CLR 4.0 (non ho un impianto 4.0 a portata di mano al momento).

È stato utile?

Soluzione

E 'peggio di così - siete spazio di processo, quando si lavora in .NET a 32 bit è molto più piccolo del limite teorico. In applicazioni a 32 bit NET, la mia esperienza è che avrete sempre tende a iniziare a ricevere errori di memoria da qualche parte intorno 1.2-1.4gb di utilizzo della memoria (alcune persone dicono che si può arrivare a 1.6 ... ma non ho mai visto che ). Naturalmente, questo non è un problema su sistemi a 64 bit.

Detto, un singolo array 2GB di tipi di riferimento, anche sui sistemi a 64 bit, è un'enorme quantità di oggetti. Anche con 8 riferimenti byte, si avrà la possibilità di allocare un array di riferimenti a oggetti 268,435,456 - ognuno dei quali può essere molto grande (fino a 2 GB, di più se si sta utilizzando oggetti nidificati). Questo è più memoria di quanto sarebbe mai veramente essere richiesto dalla maggior parte delle applicazioni.

Uno dei membri del team di CLR bloggato su questo , con alcune opzioni per modi per ovviare a queste limitazioni. Su un sistema a 64 bit, fare qualcosa come il suo BigArray sarebbe una soluzione praticabile per assegnare qualsiasi numero di oggetti in un array - molto più che il limite di 2 GB singolo oggetto. P / Invoke può permettere di allocare gli array più grandi.


Modifica:. Avrei detto questo, come pure - non credo che questo comportamento è cambiato affatto per NET 4. Il comportamento è stato invariato dall'inizio del .NET


Modifica: .NET 4.5 avranno ora la possibilità di x64 per consentire in modo esplicito gli oggetti ad essere più grandi di 2 GB impostando gcAllowVeryLargeObjects nel app.config.

Altri suggerimenti

NET Framework 4,5 array permette di creare grandi di 2GB su piattaforme a 64 bit. Questa funzione non è attiva per impostazione predefinita, deve essere abilitata tramite file di configurazione utilizzando l'elemento gcAllowVeryLargeObjects.

http://msdn.microsoft.com /en-us/library/hh285054(v=vs.110).aspx

Questo è un grosso problema nel campo numerico. Chiunque utilizzando librerie di classi numerici NET ha loro matrici memorizzato come array sotto. Questo è così librerie native possono essere chiamati a fare l'elaborazione di calcoli numerici. Il limite 2GB ostacola seriamente la dimensione delle matrici possibili a 64 bit NET. Più qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top