2012-04-04 13 views
0

Ich erzeuge einen Dateistream und wickle ihn in einen gepufferten Stream-Reader ein. Ich nehme dann den Strom eine Zeile zu einer Zeit mit Lesezeile. Nach X Anzahl von Zeilen/Bytes habe ich die Stapelüberlauf-Ausnahme getroffen. Es scheint kein Problem beim rekursiven Aufrufen einer Methode zu sein, da kleinere Dateien ohne Probleme verarbeitet werden. Ich hoffe, ich habe hier einfach etwas Einfaches übersehen. Es gibt zu viel Logik die gesamte Schnipsel hier posten, aber das ist der Kern ...StreamReader system.stackoverlow Ausnahme

Instantiates a static stream reader // 
{  
    using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read, 
    FileShare.Read)) 
    using (BufferedStream bs = new BufferedStream(fs)) 
    using (reader = new StreamReader(bs)) 

    InitializeRecord(reader) // passes reader in 
} 

InitializeRecord(StreamReader reader) 
{ 
    //Makes some determinations whether to take in the first line or skip to first header record... This is working fine. Initializes first line = reader.ReadLine() 
    // Calls the first method to generate the header output which in turns calls the LineReader Method to consume the next line. 
} 

LineReader() 
{ // Main loop for iterating over lines where stackoverflow occurs 
    while (!reader.EndOfStream) 
    { 
     string prev_line = line; 
     line = reader.ReadLine(); // StackOverFlow occurs here only on larger files/# of bytes read   
     VerifyLine(line,prev_line); 
    } 
} 

VerifyLine(string line) 
{ 
    // Does some checking on the line and calls output methods for each record type which in turn calls LineReader which LineReader exits when the endofstream is reached. 
    //But is blowing up prior to reaching the end of the stream. By writing the lines out to disk as it iterates it writes a replica of the stream perfectly until the stack overflow occurs. 
    //This is only the difference of anything greater than a 5 MB file. Some of these records are hitting 9 million characters. I tried increasing the buffer size without luck. 
} 
+0

Sie haben uns nicht die Zeilen angegeben, die das Problem verursacht haben. Irgendwo in 'InitializeRecord',' LineReader' oder 'VerifyLine' existiert Ihr Problem. – user7116

+0

Ich bearbeitet für LineReader-Methode, wo die Ausnahme ausgelöst wird. –

+0

Was ist mit "VerifyLine"? –

Antwort

1

Es scheint nicht ein Problem zu sein mit rekursiv ein Verfahren, wie es Prozesse kleinere Dateien ohne Probleme telefonieren

Aber Sie sagen, dass es auf größere Dateien richtig explodiert? Für mich hört sich das so an, als bestünde ein Problem mit Ihrer Rekursion. Gibt es trotzdem irgendwelche Operationen ohne Rekursion? Ich würde gerne mehr Code in der VerifyLine-Methode sehen.

+0

Ja, ich hatte keine Endlosschleife, weshalb ich es nicht für Rekursion hielt. Aber aufgrund eines obigen Kommentars habe ich das Call-Stack-Fenster im Debugger vergessen. Es wird nicht mehr genügend Arbeitsspeicher zur Verfügung gestellt, bevor die Endverarbeitung für größere Dateien erreicht wird. –