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?