Оптимизация перебора элементов коллекции
Имею программу, она в потоке читает 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 шт):
Для начала хотя бы используйте StringBuilder для накопления строк. Когда вы просто плюсуете строки каждый раз создаётся новая копия, это очень неоптимально.
StringBuilder sb = new StringBuilder();
...
sb.Append(word);
sb.Append(" ");
...
sb.ToString();
Ну и буферизованный ввод-вывод файлов, конечно, тоже нужен.
Дальше можно ещё многопоточность припахать - один поток на чтение файла и помещение считанных строк в очередь, несколько потоков, которые будут эту очередь разгребать и преобразовывать строки, и ещё один поток, который будет записывать в новый файл. Самый оптимальный вариант, если вам не важен порядок строк на выходе, это будет быстрее всего. В противном случае придётся потоку записи иногда ждать очередную строку по порядку в буфере обработки.