Трудно ответить без кода, знания вашей основной памяти и архитектуры. Поэтому я могу только догадываться о некоторых важных указателях:
- У вас достаточно оперативной памяти? Если вы ссылаетесь на адрес, который еще не загружен в ОЗУ, возникает ошибка страницы за кулисами и считывает данные в ОЗУ для вас. Ваша программа не замечает эту активность, потому что ваш поток приостанавливается, когда ошибка страницы обрабатывается. Хорошая статья here.
- Еще один важный момент из той же статьи. У вас нет контроля над , сколько MMF хранится в памяти или как долго. Это означает, что использование MMF может выталкивать другие вещи из ОЗУ, такие как страницы кода или данных, которые вам понадобятся «скоро». Это приводит к более медленному выполнению. Я особенно хочу указать любому человеку, читающему этот ответ, на another answer here, так что у нас есть четкое представление о том, как эта медленность протекает с точки зрения процессорных циклов slow.
- Затем вы создаете поток. Потоки подходят для последовательного доступа, хотя вы, возможно, пытаетесь читать/писать случайно.
Что касается времени выполнения конца в конец кода в FileStream против ММФ подхода, я думаю, вы должны запустить тесты заново, так как работает ваш первый подход мощь результат в прогретый кэш для второго один. Тогда результаты не будут корректными.
Согласно MSDN documentation of MMF,
отображенные в память файлы позволяют программистам работать с очень большими файлов, так как память может управляться одновременно, и они позволяют полный, случайный доступ к файлу без необходимости Ищу.
Способ работы MMF заключается в том, что вся (или часть) файла отображается в виде виртуальной памяти, которая прозрачно выгружается в ОС и выходит из нее при доступе к частям файла.Вот почему MMF отлично подходят для работы с большими файлами.
Вы можете быть умнее и читать часть всего файла и выполнить произвольный доступ путем использования:
using (var accessor = mmf.CreateViewAccessor(offset, length))
{
//Here you have access to a specific part of the file
}
, так что у вас есть доступ к представлению с указанным смещением и размера, из мамонта файла картография памяти.
Где находится файл? –
на локальном диске ssd – Sebastian
Вам нужен вид на весь файл? Если нет, попробуйте создать представление на требуемой части только путем передачи смещения и длины - 'using (var accessor = mmf.CreateViewAccessor (смещение, длина))' – displayName