Самый эффективный способ создания и записи нескольких текстовых файлов размером 10 КБ? - PullRequest
1 голос
/ 18 ноября 2009

Мы используем следующий подход к записи текстовых файлов:

public void WriteFile(string filePath, string contents)
{
    if (string.IsNullOrEmpty(filePath)) { throw new ArgumentNullException("filePath"); }
    if (contents == null) { throw new ArgumentNullException("contents"); }

    if (File.Exists(filePath))
    {
        throw new InvalidOperationException(string.Format("The file '{0}' already exists", filePath));
    }

    StreamWriter sw = File.CreateText(filePath); // slow

    sw.Write(contents);
    sw.Close(); // slow
}

Мы вызываем эту функцию много раз, поэтому производительность является ключевым фактором. Две строки прокомментировали slow, где наше приложение проводит большую часть своего времени.

Параметр contents содержит в среднем около 10 КБ текста.

Существуют ли другие подходы в .NET или использовании Win32 API, которые, как известно, имеют значительно лучшую производительность?

Мы уже попробовали следующее:

TextWriter tw = new StreamWriter(filePath);

tw.Write(contents);
tw.Close();

Но обнаружили, что производительность аналогична нашему первоначальному подходу.

Редактировать

На основании предложений мы также попробовали:

File.WriteAllText(filePath, contents);

Однако производительность этого аналогична другим, перечисленным выше.

Ответы [ 6 ]

3 голосов
/ 18 ноября 2009

Самый простой способ записи файла:

File.WriteAllText(filePath, contents);

Если у вас есть проблемы с производительностью, вы должны посмотреть на ваши требования. Поскольку в действительности нет какой-либо части операции, которая могла бы быть выполнена более эффективно, вам следует определить, может ли какая-либо часть операции быть пропущена или выполнена позже.

Например, вам нужно, чтобы файл был полностью записан и закрыт при выходе из метода? В противном случае вы можете поместить задачи в очередь и позволить фоновому потоку записывать файл за файлом в своем собственном темпе.

3 голосов
/ 18 ноября 2009

Походит на задание для фонового работника. Разгружает запись в новый поток и имеет события, чтобы уведомить вас / пользователя о прогрессе, а также о завершении.

1 голос
/ 18 ноября 2009

Забудьте о своем коде. Проблемы с производительностью при работе с жесткими дисками - это проблемы файловой системы, операционной системы и, конечно, качества оборудования.

Единственное, что я могу предложить, это изменить дизайн вашего приложения. Например, вы можете написать огромный файл вместо многочисленных маленьких файлов. Просто используйте архивирование .tar для всех из них, поскольку оно ничего не сжимает, а просто сохраняет потоки файлов один за другим.

1 голос
/ 18 ноября 2009

sw.Write ... sw.Flush (); // вставить новую строку sw.Close () ...

Если вы вставите новую строку выше, вы, вероятно, увидите «медленный» переход к ней при записи данных на диск.

Работаете ли вы антивирусное программное обеспечение, которое вы можете отключить? Можете ли вы включить кэширование записи на контроллере диска с резервным аккумулятором?

1 голос
/ 18 ноября 2009

А как насчет File.WriteAllText ?

1 голос
/ 18 ноября 2009

Вы можете создать другой поток для асинхронной записи файла в блоки данных 8k (размер внутреннего буфера).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...