Оптимальное количество параллельных запросов сильно зависит от факторов вне вашего приложения (например, количество дисков = 4, глубина NCQ = ?, глубина очереди драйвера =? ...), поэтому вы можете использовать систему, которая может адаптироваться или быть адаптированным. Моя рекомендация:
- Запишите все ваши запросы на чтение в очередь вместе с некоторыми метаданными, которые позволяют уведомить запрашивающий поток
- удалить из этой очереди N потоков, синхронно прочитать чанк, уведомить запрашивающий поток
- Сделать N изменяемой во время выполнения
- Поскольку ЦП не является вашей задачей, ваши рабочие потоки могут рассчитать среднее значение плавающей задержки (и / или максимум, в зависимости от ваших потребностей)
- Двигайте N вверх и вниз, пока не достигнете сладкой точки
Почему синхронизация читает? Они имеют меньшую задержку, чем ascync.
Зачем тратить время ожидания в очереди? Хорошая реализация очереди без блокировки начинается с задержкой менее 10 нс, что намного меньше двух потоковых переключателей
Обновление: некоторые вопросы и ответы
Должны ли потоки чтения сохранять файлы открытыми? Да, определенно так.
Вы бы использовали FileStream с FileOptions.RandomAccess? Да
Вы пишете "синхронно читайте кусок". Означает ли это, что каждый отдельный поток чтения должен начать чтение фрагмента с диска, как только он снимет порядок чтения фрагмента? Да, именно это я и имел в виду. Глубина очереди запросов на чтение управляется счетчиком потоков.