我有个项目的需求如下,
1.实时存储大量的数据.每秒33个数据组,一个数据10M.
2.我测试用普通的fopen,fwrite系列函数,速度太慢.
3.我采用内存映射方法.即,产生文件-->建立映射-->
存储数据-->关闭句柄. 4.一切看起来都很正常,但是物理内存狂丢.
5.如果我在UnmapViewOfFile函数前加入FlushViewOfFile
则内存不丢失,但是速度慢很多。 我的问题是,为什么内存对狂丢.有无好的方法来快速产生大量的文件. 代码如下: 如果有高手解答解决了问题,兄弟狂给分.!!!!
-------------------------------------------- .....
case WM_TIMER: //此定时器33秒调用一次.
WriteToDiskMapFile1(); //此函数就是生成映射文件.
break;
......
BOOL WriteToDiskMapFile1()
{ static int abc=0; abc++; //计算每次映射长度(根据一帧数据的长度,以整数大小倍数OS映射页面 一帧数据
DWORD dwBlockBytes = 32*65536; char buf[128];
char fn[256]; memset(buf,0,128);
memset(fn,0,256);
sprintf(buf,"%d",abc); //映射文件名称.这里自动生成一个文件名称.
strcpy(fn,"d:\\temp\\map");
strcat(fn,buf);
strcat(fn,".dat"); //映射文件句柄.
int ret; //这里先生成一个文件.
HANDLE handle = CreateFile(fn,GENERIC_READ ¦GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(handle, dwBlockBytes, NULL, (DWORD)FILE_BEGIN);
SetEndOfFile(handle);
//产生映射文件.
HANDLE map_handle = CreateFileMapping(handle,NULL,PAGE_READWRITE,0,0,NULL);
CloseHandle(handle);
handle = NULL; //映射视图
LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(map_handle,FILE_MAP_ALL_ACCESS,
0,
0,
0
); //对映射的视图进行访问(模拟写数据)
memset(lpbMapAddress,0x41,dwBlockBytes); //撤消文件映像
//FlushViewOfFile(lpbMapAddress,0); -->关键点
UnmapViewOfFile(lpbMapAddress);
CloseHandle(map_handle); return TRUE;
}
程序的每一行我都跟踪n遍了,不存在函数错误! 谢谢!
1.实时存储大量的数据.每秒33个数据组,一个数据10M.
2.我测试用普通的fopen,fwrite系列函数,速度太慢.
3.我采用内存映射方法.即,产生文件-->建立映射-->
存储数据-->关闭句柄. 4.一切看起来都很正常,但是物理内存狂丢.
5.如果我在UnmapViewOfFile函数前加入FlushViewOfFile
则内存不丢失,但是速度慢很多。 我的问题是,为什么内存对狂丢.有无好的方法来快速产生大量的文件. 代码如下: 如果有高手解答解决了问题,兄弟狂给分.!!!!
-------------------------------------------- .....
case WM_TIMER: //此定时器33秒调用一次.
WriteToDiskMapFile1(); //此函数就是生成映射文件.
break;
......
BOOL WriteToDiskMapFile1()
{ static int abc=0; abc++; //计算每次映射长度(根据一帧数据的长度,以整数大小倍数OS映射页面 一帧数据
DWORD dwBlockBytes = 32*65536; char buf[128];
char fn[256]; memset(buf,0,128);
memset(fn,0,256);
sprintf(buf,"%d",abc); //映射文件名称.这里自动生成一个文件名称.
strcpy(fn,"d:\\temp\\map");
strcat(fn,buf);
strcat(fn,".dat"); //映射文件句柄.
int ret; //这里先生成一个文件.
HANDLE handle = CreateFile(fn,GENERIC_READ ¦GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL);
SetFilePointer(handle, dwBlockBytes, NULL, (DWORD)FILE_BEGIN);
SetEndOfFile(handle);
//产生映射文件.
HANDLE map_handle = CreateFileMapping(handle,NULL,PAGE_READWRITE,0,0,NULL);
CloseHandle(handle);
handle = NULL; //映射视图
LPBYTE lpbMapAddress = (LPBYTE)MapViewOfFile(map_handle,FILE_MAP_ALL_ACCESS,
0,
0,
0
); //对映射的视图进行访问(模拟写数据)
memset(lpbMapAddress,0x41,dwBlockBytes); //撤消文件映像
//FlushViewOfFile(lpbMapAddress,0); -->关键点
UnmapViewOfFile(lpbMapAddress);
CloseHandle(map_handle); return TRUE;
}
程序的每一行我都跟踪n遍了,不存在函数错误! 谢谢!
解决方案 »
- 想把一个做好的程序封装成组件,,,技术实现上难么?急?在线等
- 急急急!!!如何在CRichEditCtrl中粘贴其它程序中的数据(比如图片)
- 巨量数据对内存的占用问题
- 试试提问
- 请高手来说说 命令行 和 命令行参数 的概念,谢谢
- 强制结帖合理吗?为什么提交的FAQ无人审核?
- CString::Find() 问题。如何从一个html..<input>语句中查出"name"的来!谢谢!!
- 我在用TREEVIEW控件时,不知怎样将其子项的图象更换,大概就是子项与夫项的图象不同
- 请解释一下ActiveX控件中的方法和事件有什么区别?
- IE9注册BHO问题
- ***************MySQL Binary字段类型 读写*********************在线等
- 济南学生寻暑假实习公司
目前没有问题,要解决什么?如果觉得速度不够快,需要从程序设计上考虑优化的方法。如果希望大家帮忙想办法,需要把程序的功能再描述具体一些。
程序的设计我是想有一个CACHE,是一个队列,保证网络过来的数据先推进这个CACHE内.同时
另一个存储线程再从这个队列内取出最先进入的数据.这样可以保证不丢数据.
但问题是,如果写入磁盘的程序太慢.那就会出现始终无法保证数据全部存储到硬盘内的情况.
好不容易搞了个映射,结果内存还有问题! 所以请教有无好的办法.
我的最后的办法就是直接写磁盘.不过我不想这么做.有些麻烦.还得管理扇区!谢谢!
如过各位能给解决或者提提好的思路,分数不是问题.多少都给!
但就是在映射时,我发现即使做了UnmapViewOfFile(lpbMapAddress)
和CloseHandle(map_handle),系统好像并没有把内存页面给释放掉,
因为我会频繁产生内存映射文件.因此会出现系统物理内存很快丢失,但
应用程序内存没有变化(从Task Manager中看到的)
所谓映射如果加入这句话FlushViewOfFile,存储每一帧数据(即2M)也
很慢(大约40~100ms,WINDOWXP,1.5G CPU).而且不用FlushViewOfFile,我生成的文件的数据也是对的.请各位高手帮帮忙!
效率其实和很多因素相关,就像你硬盘本身最大速率,网络编程中的带宽,这些都是单靠程序无法解决的。
你这个程序要求硬盘写入速度在66MB/s以上,我不确定你的硬盘是否具有这么高的速度,另外即使硬盘可以达到这个速度,由于需要长时间高负荷运转,普通的硬盘也是不行的,很快就会出现故障,应该用服务器专用硬盘,最好是硬盘阵列。