Ciao a tutti
Nella mia attuale esperienza lavorativa mi trovo a lavorare con file di dimensioni molto superiori ai 2GB e mi sono scontrato spesso con il limite dell'heap gestito dal .NET Framework; per ora ho sempre "brillantemente" aggirato il problema seguendo le linee guida per risolvere questo problema, cioè, utilizzando l'XmlReader invece dell'XmlDocument, bufferizzare le letture e le scritture su filesystem, utilizzando il Database o addirittura implementando logiche di swap a filesystem di parte di un DataSet.

Oramai mi ero rassegnato a questa situazione poi ho pensato di provare su una VM il Sistema Operativo a 64bit con 4GB di RAM. Il test che ho effettuato era un "fantastico :)" exe che riempiva 1000 DataSet fino al OutOfMemoryException, alla fine di questo while true mi setta la relativa label per vedere il limite di memoria raggiunta dal processo...

    try {
        while (true) {
            for (int i = 0; i < 1000; i++) {
                mMyData[i].MyDataTable.AddMyDataTableRow(sTesto, DateTime.Now);
            }
        }
    } catch (OutOfMemoryException exp) {
        lMemory = System.Diagnostics.Process.GetCurrentProcess().WorkingSet64;
       
        lblSize.Text = lMemory.ToString();
    }

I risultati sono stati per me molto significativi in quanto mentre sulla versione a 32bit l'eccezzione veniva generata intorno ai 1,6GB di memoria
sul sistema a 64 bit dopo aver allocato intorno ai 3,4GB sono dovuto intervenire manualmente per bloccarlo in quanto aveva iniziato a swappare mandando in crisi il povero HD; vedendo superare il precedente limite di oltre il doppio (1,6GB -> 3,4GB), dal mio punto di vista, il test aveva avuto esito positivo spostando in alto il limite della memoria allocabile...

Per altro questo problema dei 2GB lo trovo molto spesso su Google a riguardo dell'argomento dei Reporting Services di SQL Server, sappiamo bene tutti che invece il motore relazionale di SQL Server ha una sua gestione a basso livello per indirizzare memoria oltre i limiti del Sistema Operativo (AWE memory, /3GB) e che comunque esistono versioni speciali "Data Center Edition" fatte su misura per gestire tutta la RAM, ma questi argomenti non fanno parte del mio post in quanto questo post riguarda il Framework.

Certo, mentre cercavo di risolvere il problema sul sistema a 32bit mi sono imbattuto in un forum dove si diceva che, comunque, si deve stare attenti in quanto anche nella versione a 64bit del Framework c'è un limite sugli array in quanto l'indice (dimensione max) è comunque rappresentato da un Int32, questo per dire che il limite probabilmente persiste ma di natura diversa.

Attenzione, con questo post non voglio assolutamente fare passare l'idea che adesso tutto può stare in memoria e quindi carichiamo rusco e brusco ma almeno adesso se vogliamo utilizzare XPathNavigator invece di XmlReader e il vosto XML è di 3GB almeno assicuratevi che giri su un 64bit :)
A parte gli scherzi il mio è stato un test per un caso molto particolare e ribadisco che un'attenzione all'utilizzo della memoria DEVE essere un punto fondamentale nella stesura di ogni applicativo.

Ciao a tutti
Allino :)

PS: E' da un po' che non posto in quanto mi ultimamente mi stò dedicando ad altro (Oracle in particolare) ma sappiate che seguo sempre con attenzione questo blog. Approfitto per constatare la scelta di alcune colonne portanti di questa comunità di non mettere i loro post sul "Muro"; mi riferisco in particolare a due colonne come Igor e Lorenzo e chiedergli di ripensarci, tutti riconoscono i vostri meriti nella crescita di UGI.

Alcuni link:
http://msdn.microsoft.com/msdnmag/issues/06/11/CLRInsideOut/default.aspx?loc=it
http://www.sql-server-performance.com/awe_memory.asp
http://support.microsoft.com/kb/909678