Ho alcuni file molto grandi ciascuno della dimensione di 500MB++
, contenenti valori integer (in realtà è un po 'più complesso), sto leggendo quei file in un ciclo e calcolando il valore massimo per tutti i files. Per qualche motivo la memoria cresce costantemente durante l'elaborazione, sembra che GC non rilasci mai la memoria, acquisita dalle precedenti istanze di lines
.Perdita di memoria (?) Con StreamReader
Non riesco a trasmettere i dati e devo usare GetFileLines
per ogni file. A condizione che la quantità effettiva di memoria richiesta per memorizzare lines
per un file sia 500MB
, perché ottengo 5GB
di RAM
utilizzato dopo l'elaborazione di 10 file? Alla fine si blocca con l'eccezione di memoria esaurita dopo 15 file.
Calcolo:
int max = int.MinValue;
for (int i = 0; i < 10; i++)
{
IEnumerable<string> lines = Db.GetFileLines(i);
max = Math.Max(max, lines.Max(t=>int.Parse(t)));
}
codice GetFileLines:
public static List<string> GetFileLines(int i)
{
string path = GetPath(i);
//
List<string> lines = new List<string>();
string line;
using (StreamReader reader = File.OpenText(path))
{
while ((line = reader.ReadLine()) != null)
{
lines.Add(line);
}
reader.Close();
reader.Dispose(); // should I bother?
}
return lines;
}
chiamate il metodo 'lines.Clear()'? – opewix
Io non dovrei? – user1514042
10 x 500 Mb = 5 GB. Si stanno mantenendo tutti i contenuti dei file nell'elenco * Elenco linee *. Stesso perfetto di ReadAllLines() –
Cybermaxs