Представьте, что у меня есть приложение C #, которое редактирует текстовые файлы. Техника, используемая для каждого файла, может быть:
1) Считайте файл сразу в строку, внесите изменения и запишите строку поверх существующего файла:
string fileContents = File.ReadAllText(fileName);
// make changes to fileContents here...
using (StreamWriter writer = new StreamWriter(fileName))
{
writer.Write(fileContents);
}
2) Читайте файл построчно, записывая изменения во временный файл, затем удаляя источник и переименовывая временный файл:
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);
Каковы соображения производительности с этими параметрами?
Мне кажется, что при чтении по одной строке или чтении всего файла одновременно будет прочитано одинаковое количество данных, а время на диске будет доминировать во времени выделения памяти. Тем не менее, как только файл находится в памяти, ОС может свободно выгружать его, и когда это происходит, польза от такого большого чтения теряется. С другой стороны, при работе с временным файлом, когда дескрипторы закрыты, мне нужно удалить старый файл и переименовать временный файл, что влечет за собой затраты.
Тогда возникают вопросы относительно кэширования, предварительной выборки и размеров дискового буфера ...
Я предполагаю, что в некоторых случаях лучше обрабатывать файл, а в других лучше работать построчно. У меня вопрос, каковы условия для этих двух случаев?