Можно ли ускорить доступ к файлу из нескольких потоков одновременно используя memory-mapped files?
Здравствуйте!
Необходимо организовать доступ к файлу из нескольких потоков для того, чтобы каждый поток мог работать со своей частью файла. Но есть подозрение, что одновременный доступ к файлу может значительно снизить скорость чтения данных. Можно ли избежать этого используя вместо обычного чтения из файла отображение файла на память(memory-mapped files)?
Спасибо.
1. Сама Windows многое кэширует
2. На мой взгляд I/O операции следует разделять только тогда, когда другие вычислительные процессы достаточно длительные и I/O поток будет успевать к очередному запросу прочитать, иначе зачем?
Если открывать файл только на чтение, то многопоточность не должна негативно сказаться (за исключением скорости доступа самого диска), т.к. никаких блокировок и синхронизаций не требуется.
Файл открывается только на чтение. Я думаю, что если считывать файл из разных потоков и в каждом потоке читать свою часть файла, то общая скорость будет меньше, чем если бы файл считывался в один поток последовательно. Поэтому предполагаю использовать MMF. Или это не правильно всё?
simply_user: Если читаются разные части файла и файл большой и не умещается в кэше, то будет падение скорости чисто из-за беганья головки по диску. Именно поэтому последовательное чтение всегда быстрее фрагментированного. Это если говорить о HDD. Для SSD многопоточное чтение разных фрагментов может быть не медленнее.
maagames.ru: "падение скорости чисто из-за беганья головки по диску". И MMF тут ничем не поможет? Т.е, что я буду обращаться к разным частям файла обычным способом, что через отображённый на память файл результат будет один и тот же?
simply_user: Если нужно просто считать данные, то многопоточное чтение ничего не даст. Если там какая-то сложная обработка данных и одну "порцию" распараллелить нельзя, но можно одновременно обрабатывать различные "порции" файла, то распараллеливание чтения и обработки даст выигрыш скорости.
Более эффективным может быть чтение файла в одном потоке, а обработка данных в других, параллельно чтению файла.
Ну как бы линейное чтение в любом случае быстрее рандомного. А использование нескольких потоков можеет превратить линейное в рандомное. Быстрее по крайней мере не станет, а вот медленее скорее всего.