Ваш вопрос стал немного глубже, когда вы задали вопрос дальше. Я постараюсь охватить все ваши варианты ...
Чтение Один Файл: Сколько потоков?
Использовать одну нить.
Если вы читаете файл напрямую из одного потока, операционная система не будет извлекать файл небольшими порциями, как вы думаете. Скорее, это будет предварительная выборка файла впереди вас в виде огромных (экспоненциально растущих) кусков, так что вы почти никогда не платите штраф за переход на диск. Вы можете подождать диск несколько раз, но в целом это будет похоже на то, что файл уже был в памяти, и это даже независимо от mmap
.
ОС очень хороша для такого вида последовательного чтения файлов, потому что она предсказуема. Когда вы читаете файл из нескольких потоков, вы, по сути, читаете в случайном порядке, , что (очевидно) менее предсказуемо. Предварительные сборщики, как правило, гораздо менее эффективны со случайным чтением, в этом случае, вероятно, делает все приложение медленнее, а не быстрее.
Примечание: это еще до того, как вы добавите стоимость настройки потоков и всего остального. Это тоже чего-то стоит, но в основном это ничто по сравнению со стоимостью более блокирующего доступа к диску.
Чтение нескольких файлов: сколько потоков?
Используйте столько потоков, сколько у вас есть файлов (или некоторое разумное число).
Предварительная выборка файла выполняется отдельно для каждого открытого файла. Как только вы начнете читать несколько файлов, вы должны читать из нескольких из них параллельно. Это работает, потому что диск I / O Scheduler будет пытаться выяснить самый быстрый порядок, в котором можно прочитать все из них. Часто в ОС и на жестком диске есть планировщик дисков. Между тем, предварительный сборщик все еще может выполнять свою работу.
Чтение нескольких файлов параллельно всегда лучше , чем чтение файлов по одному. Если вы читаете их по одному, ваш диск будет простаивать между предварительными выборками; это ценное время, чтобы прочитать больше данных в память! Единственный путь, по которому вы можете пойти не так, - это если у вас слишком мало оперативной памяти для поддержки большого количества открытых файлов; это больше не распространено.
Слово предостережения: если вы слишком переусердствуете с многократным чтением файлов, чтение одного файла начнёт выбивать биты других файлов из памяти, и вы вернетесь к ситуации случайного чтения.
Объединение n файлов в один.
Обработка и создание выходных данных из нескольких потоков могут работать, но это зависит от того, как вам нужно их объединять. В любом случае вам нужно быть осторожным с тем, как вы синхронизируете потоки, хотя, безусловно, есть несколько относительно простых безблокировочных способов сделать это.
Однако нужно искать одну вещь: не беспокойтесь о записи файла небольшими (<4K) блоками. Соберите <em>не менее 4K данных за раз , прежде чем звонить write()
. Кроме того, поскольку ядро заблокирует файл при его записи, не вызывайте write()
из всех ваших потоков вместе; все они будут ждать друг друга, а не обрабатывать больше данных.