Я пытаюсь прочитать большой текстовый файл и вывести в нем различные слова вместе с ним. Я пробовал пару попыток до сих пор, и это, безусловно, самое быстрое решение, которое я придумал.
private static readonly char[] separators = { ' ' };
public IDictionary<string, int> Parse(string path)
{
var wordCount = new Dictionary<string, int>();
using (var fileStream = File.Open(path, FileMode.Open, FileAccess.Read))
using (var streamReader = new StreamReader(fileStream))
{
string line;
while ((line = streamReader.ReadLine()) != null)
{
var words = line.Split(separators, StringSplitOptions.RemoveEmptyEntries);
foreach (var word in words)
{
if (wordCount.ContainsKey(word))
{
wordCount[word] = wordCount[word] + 1;
}
else
{
wordCount.Add(word, 1);
}
}
}
}
return wordCount;
}
Как я измеряю свое решение
У меня есть текст в 200 Мбайт, который я знаю для общего количества слов (через текстовый редактор). Я использую Stopwatch class
и подсчитываю слова для обеспечения точности и измерения времени. Пока это занимает около 9 секунд.
Другие попытки
- Я попытался использовать многопоточность, чтобы разделить работу через TPL. Это включало в себя группирование нескольких строк, отправка обработка партии строк в отдельную задачу и блокирование чтение/запись в словаре. Однако это, похоже, не обеспечьте мне любые улучшения производительности.
- Это заняло около 30 секунд. Я подозреваю, что блокировка для чтения/записи словарь слишком дорог, чтобы получить любую производительность.
- Я также посмотрел тип
ConcurrentDictionary
, ноAddOrUpdate
метод требует, чтобы вызывающий код обрабатывал синхронизация из моего понимания и не принесла никакой производительности выгода.
Я уверен, что есть более быстрый способ достичь этого! Есть ли лучшая структура данных для использования для этой проблемы?
Любые предложения/критические замечания к моему решению приветствуются - старайтесь учиться и совершенствовать здесь!
Приветствия.
UPDATE: ссылка в файл теста, который я использую.