Полезно ли использовать поток для предварительной выборки из файла? - PullRequest
0 голосов
/ 08 марта 2011

Использование нескольких потоков для ускорения ввода-вывода может работать , но мне нужно обрабатывать огромный файл (или дерево каталогов) последовательно одним потоком.Однако я мог бы представить два возможных способа ускорить чтение из файла:

Feeder

Основной поток получает все свои данные из PipedInputStream (или аналогичного), который подается вспомогательным потоком., который является единственным, кто обращается к файлу.Затраты на синхронизацию выше, но при этом меньше связи с (лежащая в основе библиотеки, общающаяся с) ОС.Это просто для одного файла, но очень сложно для дерева каталогов.

Prefetcher

Основной поток открывает new FileInputStream(file) и читает его так, как если бы он был один.Вспомогательный поток открывает собственный поток поверх того же файла и читает вперед.Основному потоку не нужно ждать диска, поскольку он получает все свои данные из кэша ОС.Должна быть некоторая тривиальная синхронизация, гарантирующая, что вспомогательный поток не идет слишком далеко вперед.Это может работать для деревьев каталогов без особых дополнительных усилий.

Вопросы

  • Какую идею (если есть) вы бы порекомендовали попробовать?
  • Использовали ли выкак то так?
  • Есть еще идеи?

Ответы [ 2 ]

1 голос
/ 08 марта 2011

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

Если вы выполняете нагрузку на процессор от умеренной до интенсивной (например, синтаксический анализ XML), то наличие 2 потоков (1 чтение и 1 процесс) может помочь даже на одноядерном компьютере.Я не буду слишком беспокоиться о накладных расходах синхронизации.Когда раздоров мало, выигрыш от выполнения работы в ожидании ввода-вывода будет намного больше.Если ваш поток время от времени ожидает ввода-вывода, тогда будет еще больше преимуществ.

Я бы рекомендовал прочитать эту главу из JCiP .Обращается к этой теме.

0 голосов
/ 08 марта 2011

Это зависит! ... на ваших шаблонах доступа, на вашем оборудовании ...

«Использование нескольких потоков для ускорения ввода-вывода может работать» - ЕСЛИ ваша подсистема ввода-вывода (например, большой дисковый массив) способна обрабатывать несколько запросов ввода-вывода одновременно.

На одном настольном диске ваши выгоды будут ограничены; если у вас есть несколько потоков, выполняющих в основном независимую работу (т. е. точек синхронизации мало), вы можете извлечь выгоду из одного потока, считывающего данные, в то время как другие обрабатывают данные, считанные ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...