Сколько потоков для чтения и записи на жесткий диск?
Я разрабатываю приложение, которое собирает список со всеми файлами жесткого диска
а также после этого записывает файлы на жесткий диск.
Я хочу спросить: каково оптимальное количество параллельных потоков, которые будут выполнять эту задачу?
Я имею в виду, сколько потоков мне нужно, чтобы прочитать жесткий диск, не делая жесткий диск
чтобы замедлить работу, так как многие потоки читают ее одновременно.
Спасибо!
Ответы
Ответ 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
Многие из ответов относятся к количеству жестких дисков. Имейте в виду, что это также зависит от количества контроллеров. Иногда два жестких диска управляются одним контроллером.
Кроме того: два раздела на одном жестком диске не являются двумя жесткими дисками!