3 Stimmen

Wann sollte ich eine Datei schlürfen und wann sollte ich sie zeilenweise lesen?

Stellen Sie sich vor, ich habe eine C#-Anwendung, mit der ich Textdateien bearbeite. Die für jede Datei verwendete Technik kann entweder sein:

1) Lesen Sie die Datei auf einmal in eine Zeichenkette ein, nehmen Sie die Änderungen vor und schreiben Sie die Zeichenkette über die bestehende Datei:

string fileContents = File.ReadAllText(fileName);

// make changes to fileContents here...

using (StreamWriter writer = new StreamWriter(fileName))
{
    writer.Write(fileContents);
}

2) Lesen Sie die Datei zeilenweise, schreiben Sie die Änderungen in eine temporäre Datei, löschen Sie dann den Quelltext und benennen Sie die temporäre Datei um:

using (StreamReader reader = new StreamReader(fileName))
{
    string line;

    using (StreamWriter writer = new StreamWriter(fileName + ".tmp"))
    {
        while (!reader.EndOfStream)
        {
            line = reader.ReadLine();
            // make changes to line here
            writer.WriteLine(line);
        }
    }
}
File.Delete(fileName);
File.Move(fileName + ".tmp", fileName);

Welche Leistungsüberlegungen gibt es bei diesen Optionen?

Ich habe den Eindruck, dass entweder beim zeilenweisen Lesen oder beim Lesen der gesamten Datei auf einmal die gleiche Datenmenge gelesen wird und dass die Festplattenzeiten die Speicherzuweisungszeiten überwiegen. Sobald sich eine Datei im Speicher befindet, steht es dem Betriebssystem frei, sie wieder auszulagern, und wenn es dies tut, ist der Vorteil des großen Lesevorgangs verloren gegangen. Andererseits muss ich bei der Arbeit mit einer temporären Datei, sobald die Handles geschlossen sind, die alte Datei löschen und die temporäre Datei umbenennen, was Kosten verursacht.

Dann gibt es noch Fragen zu Caching, Prefetching und Plattenpuffergrößen...

Ich gehe davon aus, dass es in einigen Fällen besser ist, die Datei zu schlürfen, und in anderen Fällen besser ist, zeilenweise zu arbeiten. Meine Frage ist, was sind die Bedingungen für diese beiden Fälle?

4voto

Rex M Punkte 138455

In manchen Fällen ist es besser, die Datei zu schlürfen, und in anderen Fällen ist es besser, zeilenweise zu arbeiten.

Fast; nur ist das zeilenweise Lesen ein sehr viel speziellerer Fall. Die tatsächlichen Möglichkeiten, zwischen denen wir unterscheiden wollen, sind ReadAll und die Verwendung eines Puffers. ReadLine macht Annahmen - die wichtigste davon ist, dass die Datei tatsächlich Zeilen enthält und diese eine angemessene Länge haben! Wenn wir diese Annahme über die Datei nicht treffen können, wollen wir eine bestimmte Puffergröße wählen und in diese einlesen, unabhängig davon, ob wir das Ende einer Zeile erreicht haben oder nicht.

Entscheiden Sie sich also zwischen dem Lesen aller Daten auf einmal und der Verwendung eines Puffers - wählen Sie immer den am einfachsten zu implementierenden und naivsten Ansatz, bis Sie auf ein Problem stoßen. spezifisch Wenn Sie einen konkreten Fall haben, können Sie eine fundierte Entscheidung auf der Grundlage der Ihnen tatsächlich vorliegenden Informationen treffen, anstatt über hypothetische Situationen zu spekulieren.

Am einfachsten ist es, alles auf einmal zu lesen.

Wird die Leistung zu einem Problem? Läuft diese Anwendung gegen unkontrollierte Dateien, so dass ihre Größe nicht vorhersehbar ist? Dies sind nur einige wenige Beispiele, bei denen Sie die Daten zerlegen möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X