Книга: Системное программирование в среде Windows
Пример: последовательная обработка файлов с использованием метода отображения
Пример: последовательная обработка файлов с использованием метода отображения
Программа atou (программа 2.4) иллюстрирует последовательную обработку файлов на примере преобразования ASCII-файлов к кодировке Unicode, приводящего к удвоению размера файла. Этот случай является идеальным для применения отображения файлов, поскольку наиболее естественным способом указанного преобразования является посимвольная обработка данных без обращения к операциям файлового ввода/вывода. Программа 5.3 сначала просто отображает входной и выходной файлы в память, предварительно вычисляя размер выходного файла путем удвоения размера входного файла, а затем осуществляет требуемое посимвольное преобразование.
Этот пример отчетливо демонстрирует, как сложность процесса отображения файлов, выполнение которого необходимо для инициализации программы, компенсируется простотой результирующей обработки. Принимая во внимание, насколько просто выполняются обычные операции файлового ввода/вывода, применение более сложного метода могло бы показаться излишним, однако это с лихвой окупается выигрышем в производительности. В приложении В показано, что версия, использующая отображение файлов, в файловых системах NTFS работает значительно быстрее по сравнению с версиями, использующими обычные способы доступа к файлам, так что некоторое усложнение программы себя полностью оправдывает. Дополнительные результаты анализа производительности приведены на Web-сайте книги, поэтому ниже мы ограничимся лишь краткими выводами.
• Повышение производительности программ за счет использования отображения файлов наблюдается только в случае Windows NT и файловых систем NTFS.
• По сравнению с наилучшими из методик последовательной обработки файлов обеспечивается, по крайней мере, трехкратное повышение производительности .
• При работе с файлами большого размера преимущества в отношении производительности теряются. В нашем примере обычный последовательный просмотр файлов оказывается более предпочтительным, так как размер входного файла составляет около одной трети объема физической памяти. Снижение производительности метода отображения файлов в данном случае объясняется тем, что для входного файла требуется одна треть памяти, а для выходного файла, размер которого в два раза больше, — оставшиеся две трети, что заставляет нас сбрасывать отдельные части выходного файла на диск. Таким образом, в системе с объемом оперативной памяти 192 Мбайт ухудшение производительности метода отображения файлов будет наступать после достижения входными файлами размера 60 Мбайт. В большинстве случаев приходится иметь дело с файлами меньшего размера, в результате чего применение метода отображения файлов становится целесообразным.
В программе 5.3 представлена лишь функция Asc2UnMM. Основная программа совпадает с той, которая приведена в программе 2.4.
Программа 5.3. Asc2UnMM: преобразование файла с использованием метода отображения файлов
/* Глава 5. Asc2UnMM.c: Реализация, использующая отображение файлов. */
#include "EvryThng.h"
BOOL Asc2Un(LPCTSTR fin, LPCTSTR fOut, BOOL bFaillfExists) {
HANDLE hIn, hOut, hInMap, hOutMap;
LPSTR pIn, pInFile;
LPWSTR pOut, pOutFile;
DWORD FsLow, dwOut;
/* Открыть и отобразить входной и выходной файлы. */
hIn = CreateFile(fIn, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
hInMap = CreateFileMapping(hIn, NULL, PAGE_READONLY, 0, 0, NULL);
pInFile = MapViewOfFile(hInMap, FILE_MAP_READ, 0, 0, 0);
dwOut = bFailIfExists ? CREATE NEW : CREATE ALWAYS;
hOut = CreateFile(fOut, GENERIC_READ | GENERIC_WRITE, 0, NULL, dwOut, FILE_ATTRIBUTE_NORMAL, NULL);
FsLow = GetFileSize (hIn, NULL); /* Установить размер отображения. */
hOutMap = CreateFileMapping(hOut, NULL, PAGE_READWRITE, 0, 2* FsLow, NULL);
pOutFile = MapViewOfFile(hOutMap, FILE_MAP_WRITE, 0, 0, (SIZE_T)(2 * FsLow));
/* Преобразовать данные отображенного файла из ASCII в Unicode. */
pIn = pInFile;
pOut = pOutFile;
while (pIn < pInFile + FsLow) {
*pOut = (WCHAR) *pIn;
pIn++;
pOut++;
}
UnmapViewOfFile(pOutFile);
UnmapViewOfFile(pInFile);
CloseHandle(hOutMap);
CloseHandle(hInMap);
CloseHandle(hIn);
CloseHandle(hOut);
return TRUE;
}
- Архитектура системы управления памятью в Win32 и Win64
- Куча
- Управление памятью кучи
- Пример: сортировка файлов с использованием бинарного дерева поиска
- Отображение файлов
- Пример: последовательная обработка файлов с использованием метода отображения
- Пример: сортировка отображенных файлов
- Базовые указатели
- Пример: использование базовых указателей
- Динамически компонуемые библиотеки
- Пример: явное связывание функци и преобразования файлов
- Точки входа библиотеки DLL
- Управление версиями DLL
- Резюме
- Упражнения
- ГЛАВА 5 Управление памятью, отображение файлов и библиотеки DLL
- 5.3. Отображение файлов в памяти
- 6.10. Обработка файлов
- Пример установочного скрипта
- Пример из практики
- Резервное копирование многофайловых баз данных
- Восстановление с использованием инструмента gbak
- Восстановление из резервных копий многофайловых баз данных
- Создание файлов с блокировкой
- Обработка перехваченных ошибок
- 5.4 Команда trap: обработка прерываний
- ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ