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