В чем суть механизма проецирования файлов модуля scanning engine

Обновлено: 06.07.2024

Проецирование звука в память
Доброго времени суток форумчане. Завис над одной проблемой и не могу придумать выход. Есть у меня.

Заменить в текстовом файле все строчные буквы на прописные и удвоить вхождение каждой цифры (проецирование в память)
С помощью механизма проецирования в память замените в текстовом файле все строчные буквы на.


проецирование файла
Ребята помогите справится с заданием, нужно спроецировать файл данных, в спроецированном файле.

Проецирование файла данных
ПОМОГИТЕ ПОЖАЛУЙСТА Проецировать файл данных. В спроецированом файле поменять местами первую и.

Как и когда эти изменения попадают на физический жёсткий диск? Система сбрасывает изменения на диск не сразу, а в отложенном режиме (lazy).
Именно поэтому это происходит незаметно. Но ее можно "попросить" - FlushViewOfFile. Вот это и не понятно. Вернеее, с небольшими объемами понятно, но как можно незаметно сбросить на жёсткий диск 2Гб?

Сбросили 100-200 Мегабайт. Секунды через три-четыре сбросили еще столько же. И т.д.

Добавлено через 18 минут
P.S. Кстати, сбрасывается на диск ведь не все отображение, а только измененные страницы.
Так что ситуации с flush=2GB на практике встречаются редко.

P.S. Кстати, сбрасывается на диск ведь не все отображение, а только измененные страницы.
Так что ситуации с flush=2GB на практике встречаются редко. А в примере, который я привёл в первом посте, там же прийдётся весь файл переписать, отдельными страницами не обойтись? Или я не так понимаю? Сейчас попробовал с файлом в 2Гб сделать FlushViewOfFile. Получилось 20 секунд на сброс, т.е. если частями по 100-200 мгб делать, то вполне незаметно может получиться. А при создании отображеня проекции какое-то чтение с файла происходит или всё как-то через адреса делается?
Насчёт проецирования пишут, что память не выделяется, но резервируется. В чём разница? Памяти, которая выделяется для приложения, всё равно должно хватать, чтобы отображение проекции поместилось? Или это какая-то другая память, а не та что выделяется для приложения.

Проецирование - это просто отметка в соответствующей структуре, что вот этот виртуальный адрес "указывает вот сюда вот в файл". Подкачка страницы в физическую (ОЗУ) память происходит только при обращении к данным. Тогда выделяется физическая память.
Запись в файл - происходит только в том случае, если установлен флажок изменения для конкретной страницы. В удобный для ОС момент (либо принудиловка при FlushViewOfFile). Также не забывайте про файловый буфер. Если файл есть в буфере в основной памяти, то ОС не будет считывать его с диска.

Памяти, которая выделяется для приложения, всё равно должно хватать, чтобы отображение проекции поместилось? Или это какая-то другая память, а не та что выделяется для приложения. Должно хватать 2 ГБ (для 32-х разрядной системы) виртуальной памяти. Должно хватать 2 ГБ (для 32-х разрядной системы) виртуальной памяти.

В проекте win32 не удаётся и 1,5 Гб спроецировать (максимум 1,2 - 1,3), если проект x64, тогда и 3Гб получается.

Добавлено через 1 минуту

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

Решение

А в примере, который я привёл в первом посте, там же прийдётся весь файл переписать, отдельными страницами не обойтись? Или я не так понимаю?

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

А при создании отображеня проекции какое-то чтение с файла происходит или всё как-то через адреса делается?

Происходит. Но этот процесс отличается от обычного чтения файла.
Упрощенно говоря, отображение - это когда страницы виртуальной памяти разных процессов
отображаются на одни и те же физические адреса. Один процесс записал что-то в отображение -
все остальные сразу видят изменения. Файл, отображаемый в память (Memory-Mapped File, MMF) -
это все то же отображение, только каждая страница памяти этого отображения связана с
определенным местом в файле на диске. При доступе на чтение содержимое страницы загружается
из файла, - здесь работает тот же механизм, который используется в файле подкачки, в момент
доступа к страницам памяти, которые физически не присутствуют на месте, - а при доступе
на запись страница помечается как "dirty". Работающий в системе "lazy writer" постепенно
сбрасывает dirty-страницы на диск, но делает это аккуратно, в фоне, чтобы не мешать работе
других приложений.

Насчёт проецирования пишут, что память не выделяется, но резервируется. В чём разница?

Память может быть в состоянии "committed" (т.е. зафиксирована, или, как говорят, закоммичена) и
"reserved" (зарезервирована). Разница в том, что committed-страницы должны быть обеспечены
реальным ресурсом памяти, а reserved - это лишь пометка "не занимать", что память будет
использована в будущем. Выделять reserved-страницы только затем, чтобы потом сразу сделать их
committed, большого смысла не имеет, обычно разделение на reserve/commit делается для каких-то
конкретных целей.

Читайте также: