Domanda

sto testando quanto grande una collezione potrebbe essere in .Net. Tecnicamente, qualsiasi oggetto di raccolta potrebbe cresce la dimensione della memoria fisica.

Poi ho provato il seguente codice in un sever, che ha una memoria da 16 GB, in esecuzione Windows Server 2003 e Visual Studio 2008. Ho testato sia F # e C # codice, e guardò il Task Manager durante l'esecuzione. Vedo che dopo circa crescere 2GB di memoria, il programma si è schiantato con out-of-memory eccezione. Io ho impostato la piattaforma di destinazione per x64 nella pagina delle proprietà.

open System.Collections.Generic

let d = new Dictionary<int, int>()

for i=1 to 1000000000 do
    d.Add(i,i)

Ho fatto una stessa prova al href="http://www.itu.dk/research/c5/" rel="noreferrer"> C5 biblioteca raccolta . Il risultato è che il dizionario in C5 potrebbe utilizzare l'intera memoria. Il codice utilizza C5:

let d = C5.HashDictionary<int, int> ()
for i=1 to 1000000000 do
    d.Add(i,i)

Chiunque sa perché?

Altri suggerimenti

Nelle versioni di NET precedenti a 4,5, la dimensione massima dell'oggetto è 2GB. Da 4.5 in poi è possibile allocare oggetti più grandi, se gcAllowVeryLargeObjects è abilitata. Si noti che il limite per string non è interessato, ma di "matrici" dovrebbe coprire "liste", in quanto anche le liste sono supportati da matrici.

E per essere chiari, un dizionario utilizza un singolo array di aggiungere le coppie. E 'cresciuto (raddoppiato?) Ogni volta che è pieno. Quando ci sono 512 milioni di oggetti, la sua dimensione è 2GByte (con un puntatore di oggetto a 32 bit, e supponendo perfetta distribuzione). Aggiunta di un elemento in più rende il dizionario cercare di raddoppiare nuovamente la dimensione della matrice. Boom.

Il C5 HashDictionary utilizza hashing lineare, e probabilmente usa un array di benne ogni multiplo contenente (16?) Elementi. Dovrebbe funzionare nello stesso problema (molto) più tardi.

Il "Consenti oggetti di grandi dimensioni" solo aiuterà a sbarazzarsi di eccezione OOM.

Quando si ha la necessità di immagazzinare moltissimi oggetti che il problema che si vede è GC stalle (pausa). Quello che abbiamo fatto è "nascosto" dei dati da GC, che si trasformò in una soluzione molto pratica.

Vedere questo: https://www.infoq.com/articles/ Big-memoria-Part-3

È possibile utilizzare la cache che funziona come un dizionario: https://github.com/aumcode/nfx/tree/ master / sorgente / NFX / ApplicationModel / Pile

vedi la sezione caching

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