一个关于内存映射文件的问题
我想要在NTFS分区上创建一个3G大小的文件,同时文件内容全部为0xff。我用CreateFile,WriteFile的方法,大概耗时2分钟多,这个时间基本不能接受。网上人人都说内存映射文件速度快,我也试了一下,发现我的速度奇慢无比。代码如下:
void CTestNullDlg::OnButton7()
{
// TODO: Add your control notification handler code here
int i;
DWORD dwCount;
char szFile[MAX_PATH];
HANDLE hCacheFile;
DWORD dwIndexSize = 3*1048576000;//3G
char szMessage[200];
dwCount = GetTickCount();
DWORD dwRetSize;
sprintf(szFile,"d:\\TestCache\\test.bin");
DeleteFile(szFile);
hCacheFile = CreateFile(szFile,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(INVALID_HANDLE_VALUE==hCacheFile)
{
DWORD dwError = GetLastError();
LOG("\n Open cache file error,filename:%s,errornum=%d", szFile,dwError);
return ;
}
BYTE szTmp[1024];
memset(szTmp,0xff,sizeof(szTmp));
DWORD dwWrite;
HANDLE hFileMap = CreateFileMapping(hCacheFile, NULL, PAGE_READWRITE, 0, dwIndexSize, NULL);
int j;
for(i=0;i<3000;i++)
{
LPBYTE lpData = (LPBYTE)MapViewOfFile(hFileMap, FILE_MAP_ALL_ACCESS, 0, i*1024*1024, 1024*1024);
for(j=0;j<1024;j++)
{
memcpy(lpData+j*1024,szTmp,1024);
}
UnmapViewOfFile(lpData);
}
CloseHandle(hFileMap);
CloseHandle(hCacheFile);
sprintf(szMessage,"totol time=%d",GetTickCount()-dwCount);
MessageBox(szMessage);
}
测试发现,在for(i=0;i<3000;i++)循环中,如果i<300,速度还是比较快的,但后面的就变得奇慢无比。请各位大虾帮忙看看是何原因导致。
问题点数:100、回复次数:13Top
1 楼liangyufei(liangyufei)回复于 2006-08-03 17:54:56 得分 0
还有,如果我想在3G大小的文件后面再添加数据,该如何做?Top
2 楼DentistryDoctor(不在无聊中无奈,就在沉默中变态)回复于 2006-08-03 21:40:56 得分 15
你要填内容,无论用什么方法都是快不了的。Top
3 楼liangyufei(liangyufei)回复于 2006-08-04 09:38:28 得分 0
网上不是说写文件用内存映射文件也比普通的WriteFile快很多吗?为何现在的结果不是这样的呢?Top
4 楼teleinfor()回复于 2006-08-04 10:16:16 得分 20
你怎么知道这种方法不够快?!
这种方法本身已经是很快了,但是不可能1s写完3GB啊.
你的关键不是内存映射问题,而是写入数据的问题.Top
5 楼liangyufei(liangyufei)回复于 2006-08-04 14:28:30 得分 0
我也不要求在1s写完3GB,我只希望在1分钟内写完3GB,但现在是10分钟也写不完3G。Top
6 楼booklove(纳海行云)回复于 2006-08-04 15:28:33 得分 10
你试试把一个3G的文件从一个盘拷到另一个盘需要多长时间Top
7 楼loucai(羽)回复于 2006-08-05 07:16:01 得分 5
markTop
8 楼cenchure(达到)回复于 2006-08-06 15:47:13 得分 20
你把算法改一下 , 把 2 个for loop 改为一个 , mapviewfile 再放到for 外面 ,map 一次试试Top
9 楼liangyufei(liangyufei)回复于 2006-08-07 14:18:54 得分 0
3G的文件从一个盘拷到另一个盘需要2分钟左右时间。
算法是不大可能改的。如果把mapviewfile 放到for 外面,那么内存可能溢出。第二个循环我是模拟写操作,因为我要写的数据都是1K左右大小的。
我觉得可能还是我代码的问题,请各位大虾帮忙看看!Top
10 楼liangyufei(liangyufei)回复于 2006-08-09 09:19:23 得分 0
难道就没人知道吗?Top
11 楼Analyst()回复于 2006-08-09 13:27:19 得分 20
这里不要用FileMapping,因为你是只写,而用FileMapping的时候会先读再写,这样造成硬盘频繁的读取写入,所以会很慢。这里直接用WriteFile就可以了,每次写入的量不要太大,64K足矣(具体大小由实验决定)。
另外创建文件选用这个参数组合:CreateFile(szFile,GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
Top
12 楼liangyufei(liangyufei)回复于 2006-08-10 09:33:38 得分 0
我最后要实现的功能是对大文件(>3G)的快速读写,且要求占用内存较小。测试代码中只是针对写,但发现效果不佳。请各位大虾帮忙看看有何方法达到此目的,谢谢!Top
13 楼herocloud(herocloud)回复于 2006-08-10 17:25:02 得分 10
有什么需求要这样硬盘操作?
设计方面多考虑一下
Top




