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