Mi c necesita procesar una gran cantidad de datos, uno de los cuales tiene cientos de metros de largo. ¿Cómo almacenarlo en la memoria?
Categoría: Archivos asignados en memoria
Título: Uso de archivos asignados en memoria para archivos
Demostración:
1: Crear o abrir el núcleo del archivo Objeto:
// Abre el archivo para lectura y escritura.
HANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0,
NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
// Dado que hFile es un kernel); Objeto, incluso si es INVALID_HANDLE_VALUE, el CreateFileMapping a continuación todavía funciona,
// ¡así que asegúrese de verificar hFile aquí!
if (hFile == INVALID_HANDLE_VALUE) {
chMB("No se pudo abrir el archivo.");
return(FALSE);
}
2: Cree un objeto kernel de mapeo de archivos:
// Obtenga el tamaño del archivo (supongo que se puede mapear todo el archivo).
DWORD dwFileSize = GetFileSize(hFile, NULL);
// Crea un objeto de asignación de archivos. El objeto de asignación de archivos es 1 carácter más grande que el tamaño del archivo para poder asignar el archivo. El objeto de asignación de archivos es 1 carácter más grande que el tamaño del archivo, por lo que se puede colocar un carácter cero al final del archivo para terminar la cadena (archivo). Como aún no sabía
// si el archivo contenía caracteres ANSI o Unicode, asumí lo peor
// y agregué el tamaño de WCHAR en lugar de CHAR.
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE,
0,
dwFileSize sizeof(WCHAR), // Si el archivo es más pequeño que el conjunto tamaño, esta función expandirá el tamaño del archivo,
// haciendo que el archivo sea más grande en el disco, de modo que cuando el archivo se use como un archivo mapeado en memoria en el futuro, la memoria física ya existirá.
NULL.f// El nombre de este objeto de mapeo de archivos se usa para compartir el objeto con otros procesos, lo cual no necesitamos aquí todavía
if (hFileMap ==. NULL) {
chMB("No se pudo abrir el mapa del archivo.");
CloseHandle(hFile);
return(FALSE); >
}
2.
3: Asignación de datos de archivos al espacio de direcciones de proceso:
Al crear un objeto de asignación de archivos, aún debe permitir la El sistema reserva una región del espacio de direcciones para los datos del archivo y confirma los datos del archivo como memoria física asignada a esa región.
// Obtiene la dirección en la memoria donde está asignado el primer byte del archivo.
//El valor de retorno es la dirección inicial de la vista asignada:
PVOID pvFile = MapViewOfFile(hFileMap, FILE_MAP_WRITE, 0, 0, 0
if (pvFile == NULL) {
chMB("No se pudo mapear la vista del archivo.");
CloseHandle(hFileMap); hFile) ;
return(FALSE);
}
}
4: Ahora obtenemos la dirección inicial de la vista mapeada. a través de pvFile, puede realizar algunas operaciones en la vista:
Versión AnSI:
PSTR pchANSI = (PSTR) pvFile;
Versión UNICODE:
PWSTR pchUnicode = (PWSTR) pvFile;
5: Elimina la imagen de los datos del archivo del espacio de direcciones del proceso:
// Limpia todo antes de salir.
UnmapViewOfFile(pvFile);
6: cierra el objeto de mapeo de archivos y el objeto de archivo:
CloseHandle(hFileMap
CloseHandle); ( hFile);
Definición:
HANDLE CreateFileMapping(
HANDLE hFile, // Identificador de archivo
LPSECURITY_ATTRIBUTES lpAttributes, // Seguridad
DWORD flProtect,
LPSECURITY_ATTRIBES lpAttributes, // Seguridad
DWORD flProtect, // Protección
DWORD dwMaximumSizeHigh, // Alto El tamaño del DWORD de orden inferior
DWORD dwMaximumSizeLow, //El tamaño del DWORD de orden inferior
LPCTSTR lpName //El nombre del objeto
);
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // identificador del objeto de mapeo de archivos
DWORD dwDesiredAccess, // modo de acceso
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow, // DWORD de orden inferior de desplazamiento
SIZE_T dwNumberOfBytesToMap // El número de bytes que se asignarán
); p>BOOL UnmapViewOfFile(
LPCVOID lpBaseAddress // Dirección inicial
);
Consejo:
También puedes cerrar el objeto como lo antes posible para eliminar la posibilidad de fugas de recursos, por ejemplo:
HANDLE hFile = CreateFile();
HANDLE hFile = createFile() HANDLE hFile = CreateFile(...)
HANDLE hFile = CreateFile(...);
HANDLE hFileMapping = CreateFileMapping(hFile,...);
HANDLE hFileMapping = CreateFileMapping(hFile); ,...));
CloseHandle(hFile);
PVOID pvFile = MapViewOfFile(hFileMapping,...);
// Utilizar archivos asignados en memoria.
UnmapViewOfFile(pvFile);
CloseHandle(hFileMapping);
// Utiliza archivos de mapeo de memoria.