Оптимизация перебора элементов коллекции

Имею программу, она в потоке читает inTest.txt файл, далее для каждого слова проводится Trim() и слова, длина которых >= minWordLength записываются в файл outTest.txt.

Метод чтения файла:

private static string ReadFromFileStream(FileStream inFileStream)
    {
            byte[] array = new byte[LENGTH];
            inFileStream.Read(array, 0, LENGTH);

            return Encoding.Default.GetString(array);
    }

Метод записи в файл:

private static void WriteToFileStream(string text, string outFileName)
    {
        using (FileStream outFileStream = new FileStream(outFileName, FileMode.Append, FileAccess.Write)) 
        {
            byte[] array = Encoding.Default.GetBytes(text);
            outFileStream.Write(array, 0, array.Length);
        }
    }

Действия с текстом:

private static string ProcessText(string text, int minWordLength, char[] charsToRemove)
    {
        string result = "";

        text.Split(' ').ToList().ForEach(delegate(string word)
        {
            if (charsToRemove != null)
                word = word.Trim(charsToRemove);

            if (word.Length >= minWordLength)
                result += word + " ";
        });

        return result;
    }

const int LENGTH = 1000000;

С небольшими файлами проблем нет, но вот у меня тест на файле в 1ГБ. И скорость всего этого дела оставляет желать лучшего.

Вопрос: Возможно ли как то ускорить процесс?


Ответы (1 шт):

Автор решения: CrazyElf

Для начала хотя бы используйте StringBuilder для накопления строк. Когда вы просто плюсуете строки каждый раз создаётся новая копия, это очень неоптимально.

StringBuilder sb = new StringBuilder();
...
sb.Append(word);
sb.Append(" ");
...
sb.ToString();

Ну и буферизованный ввод-вывод файлов, конечно, тоже нужен.

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

→ Ссылка