Out of memory-Ausnahme Lesen und schreiben von text-Datei
Bekomme ich eine out of memory-Ausnahme ein paar Sekunden nach, führe ich den folgenden code. Es muss nicht alles schreiben, bevor die exception geworfen wird. Die text-Datei ist über ein halbes gigabyte groß ist. Die text-Datei Schreibe ich auch am Ende wird etwa 3/4 von einem gigabyte. Gibt es irgendwelche tricks, um zu navigieren um diese Ausnahme? Ich vermute, es ist, weil der text-Datei ist zu groß.
public static void ToCSV(string fileWRITE, string fileREAD)
{
StreamWriter commas = new StreamWriter(fileWRITE);
var readfile = File.ReadAllLines(fileREAD);
foreach (string y in readfile)
{
string q = (y.Substring(0,15)+","+y.Substring(15,1)+","+y.Substring(16,6)+","+y.Substring(22,6)+ ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
}
commas.Close();
}
Habe ich geändert mein code, der dem folgenden doch ich bekomme immer noch die gleiche Exception?
public static void ToCSV(string fileWRITE, string fileREAD)
{
StreamWriter commas = new StreamWriter(fileWRITE);
using (FileStream fs = File.Open(fileREAD, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string y;
while ((y = sr.ReadLine()) != null)
{
string q = (y.Substring(0, 15) + "," + y.Substring(15, 1) + "," + y.Substring(16, 6) + "," + y.Substring(22, 6) + ",NULL,NULL,NULL,NULL");
commas.WriteLine(q);
}
}
commas.Close();
}
- Sie sind immer noch die selben Fehler auf Ihrer geänderten code, indem Sie die
FileStream
in eineBufferedStream
. Tun Sie es nicht. Öffnen Sie einfach die Datei mitStreamReader
und liest Zeile für Zeile.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Lesen Sie die Datei zeilenweise ein, es wird Ihnen helfen zu vermeiden
OutOfMemoryException
. Und ich personnaly lieber mitusing
's zu handhaben-streams. Es stellt sicher, dass die Datei geschlossen ist, im Fall einer Ausnahme.In dem folgenden Beitrag finden Sie zahlreiche Methoden für das Lesen und schreiben von großen Dateien. Lesen Sie große text-Dateien mit streams in C#
Im Grunde brauchen Sie nur zu Lesen die bytes in einen Puffer, der wiederverwendet werden kann. Auf diese Weise werden Sie Last eine sehr kleine Menge von der Datei in den Speicher.
Lesen, anstatt die ganze Datei, versuchen Sie, Lesen und verarbeiten von Zeile.
So dass Sie nicht Gefahr laufen in eine out of memory exception. Denn selbst wenn es Ihnen gelingt, in der Organisation von mehr Speicher für das Programm, ein Tag wird kommen, wo die Datei wieder zu groß.
Aber das Programm kann verlieren Geschwindigkeit, wenn Sie verwenden weniger Speicher, also im Grunde müsstest du, um die balance der Speicherverbrauch und die Ausführungszeit. Eine Abhilfe wäre die Verwendung einer gepufferten Ausgang, Lesen mehr als eine Zeile zu einem Zeitpunkt oder Umwandlung der strings in mehrere threads.