<<windows核心编程>>上说:
~~~~~~~~~~~~~~~~~~~~~
当创建了一个文件映射对象后,仍然必须让系统为文件的数据保留一个地址空间区域,并将文件的数据作为映射到该区域的物理存储器进行提交。可以通过调用M a p Vi e w O f F i l e函数来进行这项操作
PVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap);~~~~~~~~~~~~~~~~~~~~~
该函数可以一次映射整个文件,也可只映射文件的一部分。如果一个文件较大达数百M,我要全部映射的话,会不会给系统造成较大负担特别是对内存的占用?因为前面说“将文件的数据作为映射到该区域的物理存储器进行提交”。我目前认为应该不会造成多大负担,因为提交物理存贮器并不是要立即将文件数据转入内存。只有当用户频繁、大量对映射到进程空间中的文件视图进行操作时,系统才需要较多内存。因此可以一次映射整个文件,而不必分批映射。请大家发表下你们的看法:)
~~~~~~~~~~~~~~~~~~~~~
当创建了一个文件映射对象后,仍然必须让系统为文件的数据保留一个地址空间区域,并将文件的数据作为映射到该区域的物理存储器进行提交。可以通过调用M a p Vi e w O f F i l e函数来进行这项操作
PVOID MapViewOfFile(
HANDLE hFileMappingObject,
DWORD dwDesiredAccess,
DWORD dwFileOffsetHigh,
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap);~~~~~~~~~~~~~~~~~~~~~
该函数可以一次映射整个文件,也可只映射文件的一部分。如果一个文件较大达数百M,我要全部映射的话,会不会给系统造成较大负担特别是对内存的占用?因为前面说“将文件的数据作为映射到该区域的物理存储器进行提交”。我目前认为应该不会造成多大负担,因为提交物理存贮器并不是要立即将文件数据转入内存。只有当用户频繁、大量对映射到进程空间中的文件视图进行操作时,系统才需要较多内存。因此可以一次映射整个文件,而不必分批映射。请大家发表下你们的看法:)
但是绝对没有必要将整个文件MapFileView,
每次view一小部分,然后处理,然后Unmap
再mapview另一部分....
肯定不能整个一起map的,地址空间就那么2G啊
这种处理方法决不会受2G文件的限制的
cnzdgs不是第一次回我贴了,感谢关照啊:) 您的意思其实也是说文件不要太大就行,要给别的代码留下存贮请求空间。请各位继续发表看法!
1、可以忽略文件映射对系统的影响。
2、因为文件映射占用的进程地址空间很大,编程时要有进程地址空间的概念,对其进行合理分配。
对于将近2GB或更大的文件是不能整个映射的。此外,对于大块地址空间(几百MB)的分配应该在程序初始化时进行,因为在程序运行中地址空间很可能被切成了若干小块,虽然可用空间的总和是足够的,但是由于没有足够大的连续空间,导致分配大块内存失败。