Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2014, 16:02   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию MapViewOfFile: в чем секрет скорости?

И снова здравствуй, любимый форум =)

я добрался до такой темы, как отображение файла в память.
когда-то давно читал, что это очень быстрая вещь и вот наконец решил ее освоить.
Благо в инете пилично информации по этой теме, так что я со всем разобрался и все работает.
но у меня остались вопросы, на которые так и не нашел ответа.

во-первых интересно в чем секрет такой быстроты.

у меня файл 160 метров. это своя простенькая база данных.
прога загружает его целиком в память и там уже разбирает.
раньше загружал с помощью BlockRead по метру, чтобы можно было показывать прогресс загрузки.
для файла 160 метров, точно не помню сколько, но секунд несколько требуется, чтобы полностью загрузить.

Но MapViewOfFile отображет его весь за 0 ms (засекал с GetTickCount);

Конечно, одни функции более оптимальны, чем другие и работают быстрее,
но здесь в обоих случаях нужно проделать минимальный объем работы - скопировать 160 метров в память.
Скопировать - значит взять с харда и положить в оперативную память. Или же нет?

Это наводит на еще один вопрос: при работе с отображением файла, откуда фактически читаются данные?
Они реально лежат в оперативной памяти, или же все-таки читаются с харда?

из всех описаний узнал, что проекция файла доступна для всех процессов и что она как-то связана с файлом подкачки.
насколько я понимаю, файл подкачки - это продолжение оперативной памяти, но уже на харде.

Отсюда возникает такое предположение:
windows что-то там у себя перенастраивает так, что нужный нам файл становится частью файла подкачки.
по крайней мере это очень сочетается с такой быстротой и тем, что файл теперь как бы в оперативной памяти.
Но если это так, то читая такую "память" мы фактически читаем с харда.

Так же написано, что в проекцию файла можно записывать свои данные,
но при этом на хард они сохраняются не сразу, а по запуску функции (что-то с Flush, точно не помню).
С этим в принципе тоже все понятно, кроме одного: как дописать в конец файла, т.е. расширить его.
Этого тоже нигде не нашел.
Есть правда свое предположение - нужно отобразить несуществующую часть файла и писать в нее.
т.е. есть у нас файл 100 байт, а мы отображаем его с 100 байта по 150 и записываем туда.


В общем просьба к тем, кто в этом разбирается - если можно прокомментируйте, пожалуйста, мои рассуждения.

Из всего вышесказанного сформулирую пару вопросов:
1. откуда фактически читаются данные при работе с проекцией?
2. как с помощью проекции дописать в конец файла?

заранее спасибо всем откликнувшимся =)

p.s. я решил, что к winapi это имеет большее отношение, чем к чему-либо еще.
xrob вне форума Ответить с цитированием
Старый 05.10.2014, 16:17   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
у меня файл 160 метров. это своя простенькая база данных.
прога загружает его целиком в память и там уже разбирает.
раньше загружал с помощью BlockRead по метру, чтобы можно было показывать прогресс загрузки.
для файла 160 метров, точно не помню сколько, но секунд несколько требуется, чтобы полностью загрузить.
Попробуйте загрузить его по байту, удивитесь на сколько дольше будет. Могу предположить, что маппирование файл в память идет большими блоками и с минимумом накладных расходов, вплоть до оптимизации перемещения головок (но это возможно, не знаю)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 05.10.2014 в 16:20.
Аватар вне форума Ответить с цитированием
Старый 05.10.2014, 16:24   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
Но MapViewOfFile отображет его весь за 0 ms (засекал с GetTickCount);
MapViewOfFile - это моральный эквивалент CreateFile, который тоже работает быстро. Если хотите сравнивать скорости чтения, пройдитесь по полученному указателю, увидите, что скорости ничем отличаться не будут.

Для добавления данных замапьте новое вью файла после конца файла. По завершении работы лишнее нужно обрезать с помощью SetFileSize(). Кроме того, отметьте, что нельзя отобразить произвольное смещение в файле, смещение должно быть кратным dwPageSize из SYSTEM_INFO структуры. Обычно это 64К.
waleri вне форума Ответить с цитированием
Старый 05.10.2014, 16:26   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Вот, вырвал тебе несколько страниц из умной книжки, покури их.
Вложения
Тип файла: rar Delphi5Book.chm_Chap.rar (403.0 Кб, 17 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 05.10.2014, 20:36   #5
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,777
По умолчанию

Цитата:
Сообщение от xrob Посмотреть сообщение
windows что-то там у себя перенастраивает так, что нужный нам файл становится частью файла подкачки.
Да, именно так и происходит. Неспроста процедура называется не загрузкой в память, а отображением. Даже больше скажу: ровно с таким же механизмом работает отображение PE-образов -- EXE и DLL, если его не убивают упаковщики типа UPX.

В результате ответственность за нахождение нужных страниц файла в памяти ложится на подсистему виртуальной памяти и подкачки. Размер страницы на x86 -- 4 КБ, вручную может быть включены большие страницы для некоторых процессов -- по 4 МБ. Работа через подсистему подкачки имеет еще то преимущество, что прочитанные страницы могут напрямую передаваться от дисковой подсистемы (кэша) приложению, не тратя дополнительные усилия на копирование в памяти.
Vapaamies вне форума Ответить с цитированием
Старый 05.10.2014, 23:39   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
у меня файл 160 метров. это своя простенькая база данных.
прога загружает его целиком в память и там уже разбирает.
раньше загружал с помощью BlockRead по метру, чтобы можно было показывать прогресс загрузки.
для файла 160 метров, точно не помню сколько, но секунд несколько требуется, чтобы полностью загрузить.

Но MapViewOfFile отображет его весь за 0 ms (засекал с GetTickCount);
что-то я сильно сомневаюсь. если вьюв делается (MapViewOfFile(,,0,0,0)) на весь файл сразу, это значит:
выделяется память (160 Мб)
содержимое файла (160 Мб) копируется в выделенную память

и как-то не верится, что такое можно сделать меньше чем за 16-20 мс (ну может одно выделение на 160 Мб пройдет, хотя тут я тоже сомневаюсь).

Цитата:
2. как с помощью проекции дописать в конец файла?
закрыть все вьювы, закрыть мап. создать новый мап больше чем размер файла, открыть вьюв на новом мапе и записать.


Цитата:
Размер страницы на x86 -- 4 КБ, вручную может быть включены большие страницы для некоторых процессов -- по 4 МБ.
почему только для некоторых? если проц поддерживает то для любого можно (кстати не 4 Мб, а 2 Мб).
f.hump вне форума Ответить с цитированием
Старый 05.10.2014, 23:55   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
это значит:
выделяется память (160 Мб)
содержимое файла (160 Мб) копируется в выделенную память
Нет, не значит.
Это значит
выделяется память (160МБ)
каждой странице памяти прописывается где в файле она находится
каждая страница памяти помечается как not present
все

До реального обращения к памяти данные из файла не считываются.

Страницы выделяются гранулярностью, указанной в dwPageSize из SYSTEM_INFO структуры. Обычно это 64К для 32бит ОС.

Последний раз редактировалось waleri; 06.10.2014 в 00:01.
waleri вне форума Ответить с цитированием
Старый 06.10.2014, 00:25   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

2waleri
а... хитрожопый манагер мапа, и весь ио управляется где-то там. я должен был догадаться.
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение скорости по видеосигналу N0Faceg Помощь студентам 7 24.04.2013 14:16
О программисты, откройте мне секрет рисования в WPF Casper-SC Общие вопросы .NET 13 10.01.2012 14:21
Ограничение скорости интернета 125874 Работа с сетью в Delphi 4 26.11.2010 16:45
Узнайте секрет OrcXCyber Свободное общение 9 20.10.2010 09:14
Раскройте секрет в файле (найти формулу) Jon63 Microsoft Office Excel 3 06.10.2007 17:04