Laden...

Hilfe bei System.OutOfMemoryException

Erstellt von alab94 vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.733 Views
A
alab94 Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren
Hilfe bei System.OutOfMemoryException

hallo ich habe ein Programm geschrieben welches mri den inhalt einer string in einen .txt datei ausgeben soll. es hat auch alles super funkttioniert. ich habe ein wenig weiter programiert und jetzt bekomme ich immer diese Fehlermeldung.

wen das programmm folgendes an die funktion weitergeibt:


            //Schreiben Templog
            c_textdatei.WriteLine(@"C:\Users\Joshua\SSD\EinsatzLog.txt", 1, strNachricht, true);
            progressBar2.Value = 50;

funktion:


public void WriteLine(String sFilename, int iLine, string sLines, bool bReplace)
            {
                string sContent = "";
                string[] delimiterstring = { "\r\n" };

                if (File.Exists(sFilename))
                {
                    StreamReader myFile = new StreamReader(sFilename, System.Text.Encoding.Default);
                    sContent = myFile.ReadToEnd();
                    myFile.Close();
                }

                string[] sCols = sContent.Split(delimiterstring, StringSplitOptions.None);

                if (sCols.Length >= iLine)
                {
                    if (!bReplace)
                        sCols[iLine - 1] = sLines + "\r\n" + sCols[iLine - 1];
                    else
                        sCols[iLine - 1] = sLines;

                    sContent = "";
                    for (int x = 0; x < sCols.Length - 1; x++)
                    {
                        sContent += sCols[x] + "\r\n";
                    }
                    sContent += sCols[sCols.Length - 1];

                }
                else
                {
                    for (int x = 0; x < iLine - sCols.Length; x++)
                        sContent += "\r\n";

                    sContent += sLines;
                }


                StreamWriter mySaveFile = new StreamWriter(sFilename);
                mySaveFile.Write(sContent);
                mySaveFile.Close();
            }
        }

die fehlermeldung


System.OutOfMemoryException

ich hoffe ihr könnt ihr helfen und sagen was sich nur falsch mach! vielen dank schon mal im voraus!

B
142 Beiträge seit 2007
vor 13 Jahren

Wie groß ist denn Datei?
Wo genau kommt den die Fehlermeldung?

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo alab94,

was genau willst du mit dem Code machen? Der sieht irgendwie sehr ungeordnet und schlimm aus.

Wenn du einfach einen Text am Ende der Datei anhängen willst dann kannst du auch File.AppendAllText oder ähnliches verwenden.

Dann musst du nicht vorher selbst alles einlesen. Und dann die Zeile einfügen.

Das Problem mit der OutOfMemoryException wird vermutlich von einer deiner Schleifen ausgelöst.
Wenn die TextDatei lang wird dann machst du hier extrem viele Operationen.
Und da Strings immutable sind wird bei jeder Änderung ein neuer string im Speicher angelegt.
Deshalb müllt dieser relativ schnell zu.

Eine Alternative wäre hier evtl. der StringBuilder welcher mutable ist.

Aber mach das besser so, dass du nicht die ganze Datei einlesen musst, weil sonst wird das sehr fehleranfällig und langsam

Gruss
Michael

A
alab94 Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

der Fehler tritt in folgender Zeile auf:


                string[] sCols = sContent.Split(delimiterstring, StringSplitOptions.None);

ich möchte Zeile 1 (also den gesamten inhalt der datei) durch den text ersetzten. Und mir ist gerade nochetwas eingefallen, wie kann ich zeilenumbrüche einfügen?

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo alab94,

wie gesagt wird dein Speicher überfüllt.
Beim Splitten kann das schon passieren wenn die Datei zu groß ist.

wie kann ich zeilenumbrüche einfügen?

dazu kannst du **:::

Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 5 und 8
Wenn du uns nicht sagst was du machen willst und wie groß die Datei ist dann können wir dir nicht bzw. nicht gut helfen

Gruss
Michael

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo alab94,

verwende lieber die StringBuilder-Klasse. Das hat den Vorteil, dass der Speicher wieder freigegeben wird. Stichwort: Garbage Collection.

Siehe auch [Artikel] Performant Strings verketten und [FAQ] Besonderheiten der String-Klasse (immutabler Referenztyp mit Wertsemantik). Die Fragen, die du stellst, sind wirklich Anfängerfragen. [Hinweis] Wie poste ich richtig? Punkt 1.1.

zero_x