Обработка больших файлов

194
22 сентября 2017, 17:11

Как грамотно использовать много-поточность что бы обрабатывать большие текстовые документы. Допустим у меня есть документ .txt в котором каждый символ 4 нужно заменить на четыре или D на Д и т.д. т.к. файлы очень большие то обработка такого числа символов(от 10 000 до 1 000 000) затягивается надолго. Использовать много поточность или как то иначе сократить время обработки?

Читаем файл :

string document = File.ReadAllText(Path);
string[] Mass = document.Split(' ');

далее в цикле обрабатываем каждый элемент массива Mass

Answer 1

Вы делаете очень неоптимально: чтение всего файла в память и разбиение на строки создаёт много ненужных объектов, и нагружает память.

Попробуйте читать файл через File.ReadLines (ни в коем случае не через ReadAllLines!), обрабатывать построчно и записывать построчно в новый файл.

Например:

File.WriteAllLines(
    "newfile",
    File.ReadLines("oldfile").Select(ProcessLine));

с функцией

string ProcessLine(string s)
{
    // обрабатываем одну строку и возвращаем результат 
}
Answer 2

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

Во вторых, прочитав содержимое, используйте Task.Parallel.Library для параллельного поиска в строках по файлу. (Parallel.ForEach)

Дальше, асинхронная запись целого файла.

READ ALSO
Парсинг сложной Xml в С#

Парсинг сложной Xml в С#

Столкнулся с проблемойУ меня есть сложная xml

271
Организация записи в файл

Организация записи в файл

Мой статический класс Logger пишет лог в текстовый файлФайл лога новый каждый день и на каждого пользователя

254
RdKafka Avro Consumer

RdKafka Avro Consumer

В клиенте RdKafka мне необходимо прочитать Avro сообщенияВ консоли я дописывал свойство:

177
asp.net mvc 5 C#

asp.net mvc 5 C#

в этом коде пишут ошибку

252