ForkJoinPool и асинхронный ввод-вывод

В одном из моих вариантов использования мне нужно получить данные с нескольких узлов. Каждый узел поддерживает диапазон (раздел) данных. Цель состоит в том, чтобы прочитать данные как можно быстрее. Ограничения есть, мощность раздела заранее не известна. Используя подход разделения работы, я мог разделить разделы на подразделы и получать данные параллельно. Одним из недостатков этого подхода является то, что один поток может получить много данных и занять больше времени, в то время как другой поток может завершиться быстрее. Другой подход заключается в использовании кражи работы, когда мы можем разбить разделы на гораздо меньшие диапазоны и использовать ForkJoinPool. Недостаток этого подхода заключается в том, что если раздел разреженный, мы можем сделать много циклов обращения к серверу, чтобы понять, что для подраздела нет данных.

У меня вопрос: если я хочу использовать ForkJoinPool, где задачи могут выполнять некоторые операции ввода-вывода, как мне это сделать? Из документации пула FJ и лучших практик, которые я читал до сих пор, кажется, что пул FJ не подходит для блокировки операций ввода-вывода. Если я хочу использовать неблокирующий ввод-вывод, как мне это сделать?


person chandra_cst    schedule 21.09.2018    source источник
comment
Где ваши разделы? Они плохо сбалансированы? Это поправимо? Является ли раздел одним файлом или несколькими файлами?   -  person Dici    schedule 21.09.2018
comment
По узлам хорошо сбалансировано (в основном), а вот данных с диапазоном быть не может. Например, если один узел управляет данными в диапазоне от 1 до 100 000, возможно, что раздел (1–1000) пуст.   -  person chandra_cst    schedule 21.09.2018
comment
Можете ли вы узнать размер данных дешево? Если нет, можете ли вы создать кеш размером с данные?   -  person Dici    schedule 21.09.2018
comment
Размер данных, если он неизвестен. Я изучаю другие подходы для оценки размера. Но меня больше беспокоит пул FJ. Подходит ли он сюда? Если да, то как мне справиться с неблокирующим вводом-выводом при использовании пула FJ. Если нет, то почему?   -  person chandra_cst    schedule 21.09.2018
comment
Как вы думаете, почему несколько запросов к одному и тому же узлу выполняются быстрее, чем один? Сделайте один запрос, извлеките данные и разделите их на потоки для обработки.   -  person Alexander Pavlov    schedule 22.09.2018
comment
цель состоит в том, чтобы прочитать данные как можно быстрее.. довольно расплывчато :-) В пулах F / J вы можете прочитать ="nofollow noreferrer">coopsoft.com/ar/CalamityArticle.html   -  person giorgiga    schedule 10.10.2018
comment
@giorgiga да, я читал это раньше, и это указывает на то, что пулы FJ не годятся для блокировки ввода-вывода.   -  person chandra_cst    schedule 14.10.2018