Пример: последовательная обработка файлов с использованием метода отображения

Пример: последовательная обработка файлов с использованием метода отображения

Программа 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;

} 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Обработка reg-файлов

Из книги Реестр Windows автора Климов Александр

Обработка reg-файлов Импорт значений из reg-файла без вывода диалогового окнаКогда вы в Проводнике щелкаете на reg-файл, то происходит импорт значений в реестр при помощи редактора реестра Regedit, при этом выводится запрос к пользователю на подтверждение этой операции, а после


Изменение отображения HTML без изменения базовых файлов

Из книги Создание шаблонов Joomla автора Автор неизвестен

Изменение отображения HTML без изменения базовых файлов Для того чтобы решить проблему разметки информации при выводе в HTML страницу в виде таблиц, как правило, нужно вносить изменения в базовые файлы. Этот метод позволит убрать таблицы из модуля входа в систему, однако, при


Поиск файлов с использованием регyлярных выражений

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Поиск файлов с использованием регyлярных выражений Всем хорошо известно, что для поиска файлов и папок с помощью стандартных средств Windows в именах можно использовать подстановочные символы "?" (обозначает любой один символ) и "*" (обозначает любое число любых символов).


Пример: уведомление с использованием sigwait вместо обработчика

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Пример: уведомление с использованием sigwait вместо обработчика Хотя программа из предыдущего примера работает правильно, можно повысить ее эффективность. Программа использует sigsuspend для блокировки в ожидании прихода сообщения. При помещении сообщения в пустую очередь


5.8. Реализация с использованием отображения в память

Из книги Системное программирование в среде Windows автора Харт Джонсон М

5.8. Реализация с использованием отображения в память Теперь рассмотрим реализацию очередей сообщений Posix с использованием отображения в память, взаимных исключений и условных переменных Posix.  ПРИМЕЧАНИЕ Взаимные исключения и условные переменные описаны в главе 7, а


Копирование файлов с использованием стандартной библиотеки С

Из книги 500 лучших программ для Windows автора Уваров Сергей Сергеевич

Копирование файлов с использованием стандартной библиотеки С Как видно из текста программы 1.1, стандартная библиотека С поддерживает объекты потоков ввода/вывода FILE, которые напоминают, несмотря на меньшую общность, объекты Windows HANDLE, представленные в программе


Копирование файлов с использованием Windows

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Копирование файлов с использованием Windows В программе 1.2 решается та же задача копирования файлов, но делается это с помощью Windows API, а базовые приемы, стиль и соглашения, иллюстрируемые этой программой, будут использоваться на протяжении всей этой книги.Программа 1.2. cpW:


Копирование файлов с использованием вспомогательной функции Windows

Из книги автора

Копирование файлов с использованием вспомогательной функции Windows Для повышения удобства работы в Windows предусмотрено множество вспомогательных функций (convenience functions), которые, объединяя в себе несколько других функций, обеспечивают выполнение часто встречающихся задач


Объекты отображения файлов

Из книги автора

Объекты отображения файлов Сначала необходимо создать для открытого файла объект отображения файла (file mapping object), у которого имеется дескриптор, а затем отобразить этот файл или только некоторую его часть на виртуальное адресное пространство процесса. Объектам


Ограничения метода отображения файлов

Из книги автора

Ограничения метода отображения файлов Как уже отмечалось ранее, отображение файлов является весьма мощным и полезным средством. Существующая в Windows диспропорция между 64-битовой файловой системой и 32-битовой адресацией снижает ценность обеспечиваемых этим средством


Пример: преобразование файлов с использованием перекрывающегося ввода/вывода и множественной буферизации

Из книги автора

Пример: преобразование файлов с использованием перекрывающегося ввода/вывода и множественной буферизации Программа 2.4 (atou) осуществляла преобразование ASCII-файла к кодировке UNICODE путем последовательной обработки файла, а в главе 5 было показано, как выполнить такую же


Обработка файлов

Из книги автора

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


Пример 10-4. Обработка списка файлов в цикле for

Из книги автора

Пример 10-4. Обработка списка файлов в цикле for #!/bin/bash# list-glob.sh: Создание список файлов в цикле for с использованием# операции подстановки имен файлов ("globbing").echofor file in *do ls -l "$file" # Список всех файлов в $PWD (текущем каталоге). # Напоминаю, что символу "*" соответствует любое имя


Пример 12-20. Пример форматирования списка файлов в каталоге

Из книги автора

Пример 12-20. Пример форматирования списка файлов в каталоге #!/bin/bash# За основу сценария взят пример "man column".(printf "PERMISSIONS LINKS OWNER GROUP SIZE DATE TIME PROG-NAME " ; ls -l | sed 1d) | column -t# Команда "sed 1d" удаляет первую строку, выводимую командой ls,#+ (для локали "С" это строка: "total N",#+ где "N" -- общее