2012-02-16 3 views
2

Я написал сценарий для чтения текстового файла 100mb + с использованием одного потока и нескольких потоков. Многопоточный скрипт использует один и тот же StreamReader и блокирует его во время вызова StreamReader.ReadLine(). После синхронизации двух сценариев они имеют одинаковую скорость (кажется, что ReadLine() - это то, что занимает большую часть времени исполнения).Быстрое чтение файлов с использованием многопоточности?

Где я могу это сделать дальше? Я думаю о разделении исходного файла на несколько текстовых файлов, чтобы каждый поток мог работать со своим собственным StreamReader, но это кажется немного громоздким. Есть ли лучший способ ускорить мой процесс?

Спасибо!

ответ

4

С одним жестким диском вы не можете сделать ничего, кроме одного производителя (для чтения файлов) нескольких моделей потребителей (для обработки). Жесткий диск должен перемещать механическую «головку», чтобы искать следующую позицию считывания. Несколько потоков, выполняющих это, будут просто отскакивать от головы и не приносить никакого ускорения (хуже, в некоторых случаях это может быть медленнее).

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

Так что используйте один поток для чтения фрагментов большого файла и либо поставите задачи в синхронизированной очереди (например, ConcurrentQueue) для нескольких потоков потребителей, либо используйте QueueUserWorkItem для доступа к встроенному пулу потоков.

+0

А, это имеет смысл. Благодаря! – sooprise

0

Где вы можете это сделать?
Добавьте несколько жестких дисков, затем на 1 жесткий диск на 1 поток. Разделите файл на жестких дисках. Похоже на RAID.

EDIT: Другие вопросы были заданы здесь много раз. Просто используйте 1 поток для чтения файла и 1 поток для обработки. Нет необходимости многопоточности.

+0

HDD? Вы имеете в виду жесткий диск? : S – sooprise

+0

yea, Жесткий диск – Adrian

+0

В ответ на ваше редактирование, я пытаюсь получить больше производительности из моего сценария. По-прежнему требуется время, чтобы прочитать большой файл, если я могу ускорить процесс, это моя цель. – sooprise

Смежные вопросы