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

Я разрабатываю приложение, которое собирает список со всеми файлами жесткого диска а также после этого записывает файлы на жесткий диск.

Я хочу спросить: каково оптимальное количество параллельных потоков, которые будут выполнять эту задачу?

Я имею в виду, сколько потоков мне нужно, чтобы прочитать жесткий диск, не делая жесткий диск чтобы замедлить работу, так как многие потоки читают ее одновременно.

Спасибо!

Ответ 1

Сначала я говорю один!

На самом деле зависит от того, нужны ли данные для чтения для сложных вычислений для разработки. В этом случае было бы удобно создавать несколько потоков для разработки различных данных диска; но это удобно, только если у вас несколько процессоров в одной системе.

В противном случае более чем один поток сделает жесткий диск более напряженным, чем необходимо: одновременные чтения из разных потоков будут выдавать операции поиска для чтения файловых блоков (*), вводя служебные данные, которые могут замедлить работу системы, в зависимости от количества файлы и размер файлов.

Прочитайте файлы последовательно.

(*) ОС действительно пытается последовательно хранить одни и те же блоки файлов, чтобы ускорить операции чтения. Дефрагментация диска происходит, поэтому для несекундных фрагментов требуется операция поиска, которая требует больше времени для операции чтения в том же месте. Попробуйте прочитать несколько файлов параллельно, вызовет множество запросов, потому что отдельные блоки файлов смежны, а несколько блоков файлов могут быть непересекающимися.

Ответ 2

Я бы сказал, что одного потока достаточно. Процессор может запускать много потоков, но скорость жесткого диска на несколько порядков ниже, чем у CPU. Даже если запуск большего количества потоков сделал запросы на ввод-вывод более быстрыми (я не уверен), это не заставит жесткий диск читать быстрее. Вероятно, это может даже замедлить работу.

Ответ 3

Если он сходит с одного жесткого диска, вы хотите минимизировать время поиска. Поэтому используйте только один поток для чтения и записи на диск.

Ответ 4

Один поток. Если вы одновременно читаете И пишите И ваше место назначения - это диск, отличный от вашего источника, а затем 2 потока. Я добавлю, что если вы делаете другие операции с файлами (например, распаковываете), часть распаковки может быть выполнена в третьем потоке.

Чтобы сделать несколько примеров (я игнорирую Junctions, Reparse Points...)

  • C: to C: 1 Thread TOTAL
  • C: to D: тот же физический диск, разные разделы: 1 Thread TOTAL
  • C: to D: другой физический диск: 2 Thread TOTAL

Я работаю над предположением, что Диск может выполнять ОДНУ операцию за раз, и каждый раз, когда "многозадачность" переключается между разными режимами чтения/записи, она теряет скорость. Механические диски имеют эту проблему (но технически NCQ МОЖЕТ помочь). Твердотельные диски, которые я не знаю (но я знаю, что USB-накопители очень медленны, если вы пытаетесь сделать 2 операции за раз)

Я искал, как вы это делаете... Я не нашел никаких "конкретных" примеров, но у меня есть некоторые ссылки на Windows API, где вы можете начать:

Ответ 5

Никогда не обрабатывать операции с IO-плотной операцией. Это медленнее, потому что дисковый зонд тратит много времени на переключение между различными потоками/файлами.

Что делать, если у меня есть несколько потоков в операциях ввода-вывода? Производить операции одновременно и выполнять их однопоточность. У нас есть контейнер, например, ConcurrentQueue<T> (или потокобезопасная очередь, написанная вами самим), и есть 10 потоков, которые будут читать из этих файлов 1.txt 2.txt... 10.txt. Вы помещаете "запросы на чтение" в очередь одновременно, другой поток обрабатывает все запросы (откройте 1.txt, получите то, что вы хотите, и продолжите с 2.txt), дисковый зонд не будет занят переключением между потоками/файлов в этом случае.

Ответ 6

Как следует из тега "С#", я предполагаю, что вы пишете управляемое приложение для выполнения операций ввода-вывода.

В этом случае я предполагаю, что количество управляемых потоков на уровне пользователя не имеет значения, поскольку они не являются фактически исполняемыми дисковыми вводами/выводами.

Насколько мне известно, запросы на диск ввода-вывода от управляемых потоков на уровне пользователя будут поставлены в очередь в очереди APC на уровне ядра, а потоки ввода-вывода Windows будут обрабатывать их.

Итак, я бы сказал, что частота запросов ввода-вывода диска, поставленных в очередь в очереди APC, будет более актуальной для вашего вопроса.

Я не видел ни одного API потоковой передачи .NET, который позволяет привязывать любые задачи пользователя к потокам ввода-вывода Windows. Однако учтите, что мой ответ основан на относительной старой информации в следующей ссылке потоки ввода-вывода Windows и управляемые потоки ввода-вывода.

Если кто-то лучше знает текущую модель пула потоков Windows 7, которая отличается от информации в ссылке, пожалуйста, поделитесь информацией, чтобы обучить меня.

Кроме того, вы можете найти следующую ссылку, полезную для понимания операций ввода-вывода файлов Windows: Синхронный и асинхронный ввод-вывод

Ответ 7

Многие из ответов относятся к количеству жестких дисков. Имейте в виду, что это также зависит от количества контроллеров. Иногда два жестких диска управляются одним контроллером. Кроме того: два раздела на одном жестком диске не являются двумя жесткими дисками!