Поскольку вы сказали, платформа и язык не имеет значения ...
Если вы хотите стабильную производительность, которая так быстро, как источник среда позволяет, единственный способ я знаю, что это может быть сделано Windows - это перекрытие не-OS-буферизованных выравниваемых последовательных чтений. Вероятно, вы можете добраться до нескольких GB/s с двумя или тремя буферами, за что, в какой-то момент вам понадобится кольцевой буфер (один писатель, читатели 1+), чтобы избежать копирования. Точная реализация зависит от драйвера/API. Если в потоке есть какое-либо копирование памяти (как в ядре, так и в usermode), связанное с IO, очевидно, что больший буфер должен копировать, тем больше времени тратится на это, а не на выполнение ввода-вывода. Таким образом, оптимальный размер буфера зависит от прошивки и драйвера. В Windows хорошие значения, которые нужно попробовать, кратные 32 КБ для ввода-вывода диска. Буферизация файлов Windows, сопоставление памяти и все это добавляет накладные расходы. Только хорошо, если вы выполняете либо (или оба) несколько чтения одних и тех же данных в режиме произвольного доступа. Таким образом, для чтения большого файла последовательно один раз, вы не хотите, чтобы ОС блокировала что-либо или какие-либо memcpy. Если вы используете C#, есть также штрафы за вызов в ОС из-за маршалинга, поэтому для кода взаимодействия может понадобиться бит оптимизации, если вы не используете C++/CLI.
Некоторые люди предпочитают бросать аппаратные средства при проблемах, но если у вас есть больше времени, чем денег, в некоторых сценариях можно оптимизировать вещи, чтобы добиться 100-1000x лучше на одном компьютере с потребительским уровнем, чем компьютеры с 1000 компьютерами. Причина в том, что, если обработка также чувствительна к задержкам, выход за пределы использования двух ядер, вероятно, добавляет латентность. Вот почему драйверы могут вызывать гигабайты/с, тогда как корпоративное программное обеспечение заканчивается на мегабайтах/с к тому времени, когда все будет сделано. Независимо от того, какая отчетность, бизнес-логика и такое программное обеспечение для предприятия, возможно, также могут быть выполнены на гигабайтах/с на двух основных потребительских процессорах, если они написаны так же, как и в 80-х годах, написавших игру. Самый известный пример, который я слышал о приближении всей их бизнес-логики, - это обмен LMAX forex, который опубликовал некоторые из их кода на основе кольцевого буфера, который, как говорили, был вдохновлен драйверами сетевых карт.
Забыть всю теорию, если вы довольны < 1 ГБ/с, одна из возможных отправных точек в Windows, которую я нашел, - это поиск источника readfile из winimage, если вы не хотите вставлять в образцы sdk/driver. Может потребоваться исправление исходного кода, чтобы правильно вычислять perf на скорости SSD. Также экспериментируйте с размерами буфера. Переключатели/h с многопоточным и/или перекрывающимся (порт завершения) IO с оптимальным размером буфера (попробуйте 32,64,128 KB и т. Д.), Не используя буферизацию файлов Windows, по моему опыту дают лучший перф при чтении с SSD (холодные данные) одновременно (используйте/a для обработки Адлера, так как иначе он слишком привязан к процессору).
Какова производительность на одном процессоре для 2G? Вероятно, вам нужно определить, является ли проблема ввода-вывода или вычислением CPU. – Cervo
Если вы действительно привязаны к диску (IO), лучший способ - купить более быстрые диски, больше дисков (в RAID0, RAID5, RAID10 и т. Д.) Или 64-разрядную машину с достаточной памятью для хранения файла на RAM-диск. Любой разумный одиночный диск должен иметь возможность вытягивать 50 МБ/с; несколько быстрых дисков должны быть способны подтолкнуть вас как минимум до 300 МБ/с. – derobert
Я бы порекомендовал вам не использовать Sys :: Mmap, а File-Map (по причинам, указанным в документации последнего). В любом случае вы, вероятно, не хотите использовать IPC :: Mmap. –