#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 потока. (но у вас еще декодинг да, думаю его в первую пару прикрепить).
Комментариев нет:
Отправить комментарий