Ho la necessità di creare continuamente stringhe di grandi dimensioni in un ciclo e salvarle nel database che attualmente offre occasionalmente un OutOfMemoryException
.interessante OutOfMemoryException con StringBuilder
Ciò che sta praticamente succedendo qui è creare una stringa utilizzando XmlWriter
con StringBuilder
in base ad alcuni dati. Quindi chiamo un metodo da una libreria esterna che converte questa stringa xml in un'altra stringa. Successivamente la stringa convertita viene salvata nel database. L'intera faccenda viene ripetuta in un ciclo di circa 100 volte per dati diversi.
Le stringhe di per sé non sono troppo grandi (inferiori a 500kByte ciascuna) e la memoria di processo non aumenta durante questo ciclo. Ma ancora, occasionalmente ottengo un OutOfMemeoryExcpetion
all'interno di StringBuilder.Append
. È interessante notare che questa eccezione non provoca un arresto anomalo. Posso prendere quell'eccezione e continuare il ciclo.
Cosa sta succedendo qui? Perché dovrei ottenere un OutOfMemoryException
sebbene ci sia ancora abbastanza memoria libera disponibile nel sistema? Questo è un problema di heap GC?
Dato che non posso eludere la conversione di tutte queste stringhe, cosa potrei fare per rendere questo lavoro affidabile? Dovrei forzare una collezione GC? Dovrebbe mettere un Thread.Sleep
nel ciclo? Devo smettere di usare StringBuilder
? Dovrebbe semplicemente riprovare di fronte a un OutOfMemoryException
?
Se utilizzo lo stesso StringBuilder ripetutamente, utilizzerei lo stesso segmento di memoria (tranne quando è necessario ingrandire l'SB)? Non risolverebbe tutti i miei problemi (molto probabilmente)? – bitbonk
Non sono sicuro, dovresti provare a vedere se il generatore di stringhe mantiene la sua capacità quando cancellato ... – Guillaume
Non totalmente inutile: puoi evitare la frammentazione della memoria che sembra essere il vero problema qui. – Guillaume