Speicher-stream out of memory-Ausnahme, wenn die Dateigröße greter als 4 gb
Ich habe ein problem mit Speicher-stream. Ich bin immer eine Ausnahme von out-of-memory-Ausnahme. Wie Sie damit umgehen können.
var file = VC.ReadStream(filename, true);
var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);
var fileContentBytes = memoryStream.ToArray();
memoryStream = null;
LogUtil.Log(LogUtil.LogType.INFO, String.Format("File size: {0} bytes", fileContentBytes.Length));
var enc = new UTF8Encoding();
var filecontent = enc.GetString(fileContentBytes);
- 32-bit-oder 32-bit-Programm? Sie wissen, dass es eine harte Grenze an Arbeitsspeicher für die 32-bit-Programme? Haben Sie sah in der Vermeidung von memory-stream und über ein MMF (Memory Mapped File)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ersten, die Größe der
String
ist beschränkt auf 2Gb, und das ist, warumwerden OutOfMemory Ausnahme. Weiter, hast du einen Riesen overhead an
Da beide
memoryStream
undfileContentBytes
array sind über 4 GbSie sind 8 Gb insgesamt. Noch ein weiteres Problem: bei der Arbeit mit
IDisposable
Sie sollen entsorgen Instanzen:
Wenn Ihre Aufgabe ist, um den Datei Größe in ein log brauchen Sie nicht die Datei zu Lesen, an alle:
Beim arbeiten mit Datei-Inhalte verwenden
FileStream
Klasse stattMemoryStream
da es funktioniert mit Speicher-chunks (Kbs in der Größe, in der Regel 4 oder 8 Kb)Lesen eine so große Datei auf einmal im Speicher ist nicht so Gottes Idee. Da dies eine text-Datei sollten Sie es Lesen und verarbeiten, Zeile für Zeile, mit
FileStream.ReadLine()
. Wenn es ein bynary-Datei, finden Sie einige der chunking-Strategie. Wenn Sie wirklich nicht tun können, so versuchen Sie, mit einigen Speicher-Mapping-Technik.Ich kann auch beraten Sie, um Ihnen die
StreamReader.ReadLineAsync()
Methode.