Хотя вы можете использовать второй поток для анализа данных после их прочтения, вы, вероятно, не получите от этого огромного дохода. Попытка использовать более одного потока для чтения данных почти наверняка повредит скорости, а не улучшит ее. Использование нескольких потоков для обработки данных не имеет смысла - обработка будет во много раз быстрее, чем чтение, поэтому даже при наличии только одного дополнительного потока ограничение будет равно скорости диска.
Один (возможный) способ получить значительную скорость - обойти обычные iostreams - в то время как некоторые почти такие же быстрые, как при использовании C FILE *, я не знаю ничего более быстрого, а некоторые значительно медленнее. , Если вы выполняете это в системе (например, Windows), в которой модель ввода / вывода заметно отличается от C, вы можете получить значительно больше при небольшой заботе.
Проблема довольно проста: файл, который вы читаете (потенциально) больше, чем доступное пространство кеша, но вы ничего не получите от кеширования, потому что вы не собираетесь перечитывать куски подать снова (по крайней мере, если вы делаете что-то разумно). Таким образом, вы хотите сказать системе обойти любое кэширование и просто перенести данные как можно напрямую с жесткого диска в вашу память, где вы сможете их обработать. В Unix-подобных системах это, вероятно, open()
и read()
(и не принесет вам много пользы). В Windows это CreateFile
и ReadFile
, передав флаг FILE_FLAG_NO_BUFFERING
в CreateFile
- и это, вероятно, примерно удвоит вашу скорость, если вы все сделаете правильно.
Вы также получили несколько ответов, рекомендовавших выполнять обработку с использованием различных параллельных конструкций. Я думаю, что они в корне ошибочны. Если вы не сделаете что-то ужасно глупое, время для подсчета слов в файле будет только на несколько миллисекунд дольше, чем просто для чтения файла.
Структура, которую я бы использовал, состояла в том, чтобы иметь два буфера, скажем, по мегабайту за штуку. Чтение данных в один буфер. Переведите этот буфер в ваш счетный поток, чтобы подсчитать слова в этом буфере. Пока это происходит, считайте данные во второй буфер. Когда это будет сделано, в основном поменяйте местами буферы и продолжайте. Есть небольшая дополнительная обработка, которую вы должны будете выполнить при замене буферов, чтобы иметь дело со словом, которое может пересекать границу от одного буфера к другому, но это довольно тривиально (в основном, если буфер не заканчивается белым пробел, вы все еще в слове, когда начинаете работать со следующим буфером данных).
Пока вы уверены, что он будет использоваться только на многопроцессорной (многоядерной) машине, использование реальных потоков - это нормально. Если есть вероятность, что это когда-либо может быть сделано на одноядерном компьютере, вам лучше использовать один поток с перекрывающимся вводом-выводом.