MapViewOfFile 如何处理大文件

iamduo 2010-03-17 07:04:21
用内存映射的方法把一个文件加载进来没有问题。
但是,如果是个大文件,就会出错。
FFileHandle:=CreateFile(PChar(AFileName),GENERIC_ALL,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
FSize:=Windows.GetFileSize(FFileHandle,nil);
FMappingHandle:=CreateFileMapping(FFileHandle,nil,PAGE_EXECUTE_READWRITE,0,0,nil);
FMemory:=MapViewOfFile(FMappingHandle,FILE_MAP_READ,0,0,0);
if FMemory=nil then raise Exception.Create('FMemory=nil'); // 这里小文件不会成nil,大文件就是nil

请教有能解决的吗?
...全文
671 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
iqyely 2010-03-18
  • 打赏
  • 举报
回复
来学习下。
Kingron 2010-03-18
  • 打赏
  • 举报
回复
采用分页机制吧。
例如设定每次映射大小为50M,首先映射第一个50M,处理完后,映射第二个50M。
FileMapping本身支持offset的。
金卯刀 2010-03-18
  • 打赏
  • 举报
回复
CreateFileMapping的 hfile參數若是 INVALID_HANDLE_VALUE,則意味著 mapping object 依賴于 頁面文件(the paging file )。頁面文件的大小,決定著可以maping的文件大小,參考:
If a file mapping object is backed by the paging file (CreateFileMapping is called with the hFile parameter set to INVALID_HANDLE_VALUE), the paging file must be large enough to hold the entire mapping. If it is not, MapViewOfFile fails. The initial contents of the pages in a file mapping object backed by the paging file are 0 (zero).
這樣就有機會使得處理的文件變得比較大。但限制最多是4G(32位OS)
SQLDebug_Fan 2010-03-18
  • 打赏
  • 举报
回复
如果文件没有碎片,流是不慢的,但是如果磁盘碎片很多,你用流处理100M的文件要1分钟,可能你处理200M的文件就要3分钟。
shuangyan 2010-03-18
  • 打赏
  • 举报
回复
就个人使用情况而言,使用内存映射并不见得比使用流处理要快,前提是流操作的当的话。
SQLDebug_Fan 2010-03-18
  • 打赏
  • 举报
回复
如果不是追求效率,DELPHI 7以上版本的TFileStream都支持处理大文件,如果追求效率可以采用MapViewOfFile的分页机制,这样在处理效率上会有提高,特别是磁盘碎片很多的情况下。
映射大文件你要这么用MapViewOfFile(FMapHandle, FILE_MAP_READ,
OffsetHigh, OffsetLow, NumberOfBytesToMap);而不是都传入0
liuzemin 2010-03-18
  • 打赏
  • 举报
回复
回答不出你的问题,

而且想问一个问题,内存映射是解决什么问题的?

lw19860412 2010-03-18
  • 打赏
  • 举报
回复
我是来看高手如何问问题的
shuangyan 2010-03-18
  • 打赏
  • 举报
回复
不一定到2G,内存不够或者无法找到连续的内存都有可能出错
wanglipo 2010-03-18
  • 打赏
  • 举报
回复
关注,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ahjoe 2010-03-17
  • 打赏
  • 举报
回复
我是来学习的
gyk120 2010-03-17
  • 打赏
  • 举报
回复
不能超过2G,因为用户模式下地址空间只有2G,而且这2G还包括 kernel32.dll, gdi32.dll, user32.dll之类的东西,大文件没法映射,只能映射部分文件

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧