![]() |
MemoryMappedFile & ReadFile
Добрый день.
В общем задание - сравнить скорость чтения отображенного в ОЗУ файла и просто напрямую с диска через ReadFile. ("Сравнить среднее время доступа к данным в файле при использовании метода отображения файла на адресное пространство процесса и при использовании традиционного доступа к файлу с использованием системного вызова ReadFile.") Погуглил погуглил и MSDN и пр. мне сказали что отображением файла занимается класс MemoryMappingFile. Вроде прогу написал, всё работает. НО ReadFile (который как я понял считывает с харда напрямую?) работает БЫСТРЕЕ чем в случае отображения файла. Код:
using System; Mapped to RAM: 1 megabytes Reading time: 3 milliseconds Mapped to RAM: 20 megabytes Reading time: 70 milliseconds Mapped to RAM: 256 megabytes Reading time: 836 milliseconds Reading from HDD... First block readed success. Time:0 Second block readed success. Time:12 Third block readed success. Time:173 Statistics: with mapping (from RAM): 3 70 836 without mapping (from HDD): 0 12 173 WTF?.... Вроде сборщик мусора принудительно запускал, но память не очищается - до первого ReadKey прога весит в озу 19 мб, до второго ReadKey 300 мб, до третьего (в итоге) - примерно 570 Мб. |
Цитата:
Цитата:
Что тебя спрашивают? Правильно! "Сравнить среднее время доступа к данным в файле(1) при использовании метода отображения файла(2) на адресное пространство процесса и при использовании традиционного доступа к файлу(3) с использованием системного вызова ReadFile." Объясни мне, какое отношение написанный код имеет к скорости чтения файлов и мапирования их в память? Отвечу - никакого! То, что ты написал - подготовительный этап тестирования. Да, мапирование дольше, т.к. там 1 - чтение файла с медленного HDD, 2 - запись данных в ОЗУ (+накладные расходы, выделения памяти, менеджера памяти и т.д.). Чтение - это просто чтение. ---- Вот сейчас, когда у тебя файл на hdd и его дубликат в памяти, проводи тесты на скорость линейного доступа, случайного доступа. Получишь графики - объясняй их форму, характер и т.д. Вот это - курсовая. А то что у тебя сейчас есть - это подготовительный этап, важный, но подготовительный. От него зависит, как именно файл будет расположен в памяти, и как файл будет расположен на hdd. Это исходные данные. ---- Беглый просмотр кода, позволяет тебя поздравить с выполнением этого этапа. Теперь самое интересное - тесты на скорость доступа. Успехов! :) |
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
long a1 = DateTime.Now.Ticks; accessor1.ReadArray<int>(0, Sc3.mas3, 0, 262144); // 1 mb long a2 = DateTime.Now.Ticks; time1 = (a2 - a1) / 10000; // milliseconds ? Чем не тест? |
ок.
Цитата:
Что куда попадает, в какой структурной форме (уровнем асбтракции) и т.п. Т.е. у меня сейчас предположение, что тут "навёрнута" слишком дурацкая конструкция со множеством "вложенностей" Код:
(var mmf1 = MemoryMappedFile.CreateFromFile(@"C:\Users\RazoR\Documents\Visual Studio 2010\Projects\sizetests1\sizetests1\bin\Debug\Test.data", FileMode.Open, "file1") Код:
(var accessor1 = mmf1.CreateViewAccessor(offset1, length1) Где в коде можно поставить точку и сказать, что "Вот. Вот здесь мы получили "чистую" копию файла в памяти"? Проверь, что не идет динамического обращения к дисковой подсистеме. Постарайся вообще убрать всякую оптимизацию кода компилятором. А то кто эти компиляторы .NET знает, вполне могли оптимизировать. Код:
accessor1.ReadArray<int>(0, Sc3.mas3, 0, 262144); // 1 mb ---- Цитата:
|
Цитата:
Цитата:
CreateViewAccessor() - Создает метод MemoryMappedViewAccessor, который соответствует представлению размещенного в памяти файла. Внизу ссылки - пример. http://msdn.microsoft.com/ru-ru/libr...appedfile.aspx Так что насчёт "дурацкая конструкция" - всё к мелкософту. Цитата:
Цитата:
Цитата:
|
Цитата:
Цитата:
У меня вопрос тот же. Поставить пальцем точку в листинге программы и сказать, что "От сих мы работаем только с ОЗУ". И разумеется обосновать свое решение. Хорошо бы вообще отключить физический доступ к носителю, после того, как файл был скопирован в память. BTW имеет ли разницу слова "скопировать файл в память" и "смапировал/отобразил файл в память"? ---- На предзащите гораздо интереснее смотреть толковый график, нежели всматриваться в микро(очень маленькую? :))статистику с колонками цифр. |
Цитата:
Цитата:
Цитата:
Цитата:
В общем. Проблема решилась. Дело было в том, что при таком Цитата:
Код:
for (i = 0; i < length_1; i++) |
Время: 18:22. |
Время: 18:22.
© OSzone.net 2001-