Чтение больших текстовых файлов с потоками в C # - PullRequest
84 голосов
/ 29 января 2010

У меня есть прекрасная задача - решить, как обрабатывать большие файлы, загружаемые в редактор сценариев нашего приложения (это похоже на VBA для нашего внутреннего продукта для быстрых макросов). Большинство файлов имеют размер около 300-400 КБ, что вполне нормально. Но когда они выходят за пределы 100 МБ, процессу трудно (как и следовало ожидать).

Что происходит, так это то, что файл читается и помещается в RichTextBox, который затем перемещается - не беспокойтесь об этой части.

Разработчик, написавший исходный код, просто использует StreamReader и выполняет

[Reader].ReadToEnd()

, что может занять некоторое время.

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

Некоторые предположения:

  • Большинство файлов будет 30-40 МБ
  • Содержимое файла - текстовое (не двоичное), некоторые в формате Unix, некоторые в DOS.
  • Как только содержимое получено, мы выясняем, какой терминатор используется.
  • Никого не волнует, когда он загружает время, необходимое для рендеринга в richtextbox. Это просто начальная загрузка текста.

Теперь по вопросам:

  • Могу ли я просто использовать StreamReader, затем проверить свойство Length (например, ProgressMax) и выдать Read для установленного размера буфера и выполнить итерацию в цикле while WHILST внутри фонового работника, так что он не ' заблокировать основной поток пользовательского интерфейса? Затем верните построитель строк в основной поток после его завершения.
  • Содержимое будет отправлено в StringBuilder. я могу инициализировать StringBuilder с размером потока, если длина доступна?

Это (по вашему профессиональному мнению) хорошие идеи? В прошлом у меня было несколько проблем с чтением контента из Streams, потому что он всегда будет пропускать последние несколько байтов или что-то еще, но я задам другой вопрос, если это так.

Ответы [ 11 ]

0 голосов
/ 22 января 2018

Все отличные ответы! однако для кого-то, ищущего ответ, они кажутся несколько неполными.

Поскольку стандартная строка может иметь только размер X, от 2 ГБ до 4 ГБ в зависимости от вашей конфигурации, эти ответы на самом деле не отвечают на вопрос ОП. Одним из методов является работа со списком строк:

List<string> Words = new List<string>();

using (StreamReader sr = new StreamReader(@"C:\Temp\file.txt"))
{

string line = string.Empty;

while ((line = sr.ReadLine()) != null)
{
    Words.Add(line);
}
}

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

...