Страницы

Поиск по вопросам

воскресенье, 8 декабря 2019 г.

Сколько потоков нужно для чтения файлов с диска?

#java #многопоточность #файлы


Имеется 400,000 xml-файлов. Вес большей части не превышает 2КБ. Java-приложение должно
считать их с диска, обработать (сейчас используется stax парсер) и загрузить в различные
коллекции.

Сколько потоков нужно использовать для этой цели? Одни люди говорят, что больше одного
потока для чтения с диска использовать неэффективно, другие наоборот включают достаточно
много потоков.



Дополнено:

@Arhad @KoVadim @Monk если запускать программу впервые (т.е. warmup'a нет), то у
меня этот процесс занимает аж целый час, на других машинах - не больше 15 минут. После
нескольких запусков у меня тоже где-то 15 минут обработка занимает. Вчера попробовал
forkjoinpool (каждая папка уходит в отдельный тред) и fixedthreadpool (просто скидываю
подряд все файлы в виде runnable-тасков) - толку ноль.

Выставлял 4 нити (столько ядер у процессора). Может можно как-то увеличить количество
единоразовой подачи информации с диска в память, файлы ведь дефрагментированы, должны
подряд идти непосредственно на носителе, если я правильно понимаю.

По поводу разделения логики: думал об этом в самом начале. Но вряд ли это можно применить
к stax парсеру.
    


Ответы

Ответ 1



Если кратко, то универсального ответа на данный вопрос не существует. Вооружитесь профилировщиком и ищите максимум производительности среди различного количества одновременно открываемых файлов. Дело в том, что: с одной стороны, HDD и SSD не могут быть опрошены одновременно в несколько потоков, даже если эти потоки принадлежат разным процессам; но с другой стороны, операционная система как правило делает чтение на упреждение в буфер, размещаемый в незанятой области ОЗУ. Однако предсказать удачность подобного кэширования практически невозможно из-за совокупности огромного количества постоянно меняющихся факторов.

Ответ 2



Разделяйте логику. Грузите в одном потоке файлы, в другом - обрабатывайте загруженные. Диск не будет простаивать, пока идёт обработка, как если бы вы работали в одном потоке, но и не будет пытаться в несколько потоков загружать файлы, что редко дает толк без низкоуровневой обработки.

Ответ 3



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

Комментариев нет:

Отправить комментарий