我刚开始是把函数
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
最后一个参数设为整个文件大小,将整个文件映射进去,运行完程序内存占用高达200多兆,因为在这个程序中,我使用了递归,在递归的每一层都创建两个内存映射文件,一个读,一个写,然后在进入下一层的时候,把两个内存映射对象都close掉,我想是不是内存映射文件创建得太多,或者不应该每次都把整个文件映射进去的缘故。后来我在另一段程序中,我只创建一个写的内存映射对象,然后把上百个文件(每个文件不到1M),一个个写写到这个内存映射对象中,我设置最后一个参数设置的时候,是要写多大数据就设多大,把偏移量dwFileOffsetLow也计算设置好,写完一个文件以后调用UnmapViewOfFile( lpMapAddress ),但是现在每写一个文件就增长2M内存,太恐怖了,写完100个要占用多少啊,我觉得应该是我对内存映射还理解不够,但是网上找了很久,看了很多,但还是那些东西,请那位高手对内存映射很熟悉的,给点指导,谢谢了!!!!
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
DWORD dwNumberOfBytesToMap
);
最后一个参数设为整个文件大小,将整个文件映射进去,运行完程序内存占用高达200多兆,因为在这个程序中,我使用了递归,在递归的每一层都创建两个内存映射文件,一个读,一个写,然后在进入下一层的时候,把两个内存映射对象都close掉,我想是不是内存映射文件创建得太多,或者不应该每次都把整个文件映射进去的缘故。后来我在另一段程序中,我只创建一个写的内存映射对象,然后把上百个文件(每个文件不到1M),一个个写写到这个内存映射对象中,我设置最后一个参数设置的时候,是要写多大数据就设多大,把偏移量dwFileOffsetLow也计算设置好,写完一个文件以后调用UnmapViewOfFile( lpMapAddress ),但是现在每写一个文件就增长2M内存,太恐怖了,写完100个要占用多少啊,我觉得应该是我对内存映射还理解不够,但是网上找了很久,看了很多,但还是那些东西,请那位高手对内存映射很熟悉的,给点指导,谢谢了!!!!
2.UnmapViewOfFile中的lpMapAddress是我封装在类中的私用成员,MapViewOfFile直接返回给他,用完以后用UnmapViewOfFile关闭它,然后在写下一个文件的时候,在调用MapViewOfFile返回给 lpMapAddress用完后再用UnmapViewOfFile关闭它,如此循环,循环有上百次3.我上一个程序用的是递归,这个没有用递归,我就想看一下是不是递归的问题,再说递归的时候,在进入下一层的时候,已经close了阿
------------------------------------------
先把上次的UnmapViewOfFile,不要用递归!
VOID CFileMapping::FileWrite(BYTE* SrcPointer,DWORD n,DWORD FileStart)
{
MapHeadAddress = MapViewOfFile(
hMapFile,
FILE_MAP_WRITE,
0,
FileStart, // 从FileStart开始映射
n); // 需要影射的大小,从函数传入
::memcpy((BYTE*)MapHeadAddress,SrcPointer,n);}//关闭页面的函数,每写完一个数据后就调用它
VOID CFileMapping::CloseFileView()
{
::UnmapViewOfFile( MapHeadAddress );
}
VOID CFileMapping::FileWrite(BYTE* SrcPointer,DWORD n,DWORD FileStart)
{
MapHeadAddress = MapViewOfFile(
hMapFile,
FILE_MAP_WRITE,
0,
FileStart, // 从FileStart开始映射
n); // 需要影射的大小,从函数传入
memcpy((BYTE*)MapHeadAddress,SrcPointer,n);
UnmapViewOfFile( MapHeadAddress ); //用完后立刻释放
}
利用返回的 MapHeadAddress和memcpy写数据4.写完一文件后,就调用上面的CloseFileView()函数关闭页面,5.上面这个循环有100多次
{
MapHeadAddress = MapViewOfFile(
hMapFile,
FILE_MAP_WRITE,
0,
FileStart, // 这个FileStart如果是0返回的MapHeadAddres正常 ,我第二次调用这个偏移量为84的时候,就不行了,返回为NULL,怎么回事,不是可以随便设定开始映射的位置吗?
n);
memcpy((BYTE*)MapHeadAddress,SrcPointer,n);
UnmapViewOfFile( MapHeadAddress );
}
可通过GetSystemInfo取得sysInfo.dwPageSize的大小。
{
MapHeadAddress = MapViewOfFile(
hMapFile,
FILE_MAP_WRITE,
0,
FileStart, // 从FileStart开始映射
n); // 需要影射的大小,从函数传入
memcpy((BYTE*)MapHeadAddress,SrcPointer,n);
UnmapViewOfFile( MapHeadAddress ); //用完后立刻释放
}
GetSystemInfo(&sinf);
DWORD dwAllocationGranularity = sinf.dwAllocationGranularity;
偏移(FileStar % dwSysGran)开始写