2009-08-13 2 views
6

Каков рекомендуемый подход для получения наилучшей производительности, когда нам нужно создавать текстовые файлы размером более 10   МБ?Как я получаю лучшую производительность от .NET StreamWriter в C#?

В коде есть несколько разделов, которые должны записывать материал в один файл. Это означает много текстовых строк.

Вариант № 1 (Эта логика будет вызываться в несколько раз):

  1. Создание экземпляра
  2. StreamWriter Написать несколько строк (по некоторой бизнес-логике)
  3. Закройте экземпляр StreamWriter

Вариант № 2:

  1. Создайте StreamWriter в начале программы
  2. Напишите все строки из разных разделов кода.
  3. Закройте StreamWriter в самом конце, когда ничего не нужно писать.

Вариант № 3: Любой другой?

Помните, что выходной файл может быть больше 10   МБ.

ответ

13

Удержание одного открытого писателя будет более эффективным, чем повторное открытие и закрытие его. Однако, если это критические данные, вы должны позвонить Flush() после каждой записи, чтобы убедиться, что она попадает на диск.

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

У вас есть проблемы с производительностью? 10MB довольно мало в эти дни ... на моем нетбуке все еще занимает около секунды или два, чтобы писать 10 МБ (и нет, это не твердотельный диск).

0

Используйте StringBuilder, чтобы объединить текст и только открыть и записать один раз в файл.

+0

Однако StringBuilder сохранит весь файл в памяти. – David

+0

10 МБ памяти !? Это неслыханно! ;-) –

0

В обоих сценариях 1 и 2 вы должны спросить себя, требуется ли одновременный доступ к файлу. В этом случае в сценарии 2 StreamWriter не является опцией, поскольку он не синхронизирован. В сценарии 1 вы должны открыть каждый StreamWriter таким образом, чтобы он получал эксклюзивную блокировку файла.

Предполагая последовательный доступ, я бы никогда не пошел со сценарием 2. Он требует прохождения вокруг вашего StreamWriter в каждый раздел кода, который ему нужен. И кто отвечает за закрытие писателя снова. Это быстро станет недостижимым.

Сценарий 1 имеет тот недостаток, что вы должны открыть StreamWriter везде, где он нужен, что также становится недостижимым. Кроме того, теперь вы должны знать в каждом разделе кода расположение файла.

Я хотел бы использовать обходную оболочку Single Stream вокруг StreamWriter, чтобы вы могли использовать ее везде, где хотите, не создавая много зависимостей от самого StreamWriter.

0

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

Смежные вопросы