用内存映射文件创建大文件并随机写满导致机子卡死的问题

linyanxin2007 scut 2011-07-22 10:57:30
小弟创建了一个4G文件,一次256K地随机写满,所以每次用MapViewOfFile映射256K,写完后用UnmapViewOfFile释放视图,这样子循环,写到3G大小左右的时候,就会变得很慢,我查了下是卡在memcpy那里,不知是否内存耗尽的问题,希望有此经验的解答一下,顺便给个解决方法。
ps:我的机子内存4G,创建1G或2G速度都很快,只要几秒。
...全文
201 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
clz0502 2013-07-01
那用UnmapViewOfFile,怎样使内存马上释放呢?
回复
wuxiao0313 2012-10-13
memcpy确实有卡死的情况
回复
linyanxin2007 2011-07-23
经过实践猜想,UnmapViewOfFile并没马上释放内存资源,而是交由系统把视图里的数据写回磁盘,导致了资源释放缓慢。UnmapViewOfFile就像一个异步的函数,马上返回成功,但其实是由系统来完成后续的工作,在内存申请快速而释放缓慢的情况下,内存很快就会耗尽。
欢迎拍砖和指导。
回复
赵4老师 2011-07-22
读大文件,偶只用_lseeki64!
回复
linyanxin2007 2011-07-22
[Quote=引用 6 楼 wzx19840423 的回复:]
char* buff = new char[piecesize];
memset(buff, 0xff, piecesize);
memcpy(pbFile,buff,piecesize);
delete[] buff;
这段问题太大,没看出buff有什么用,piecesize每次取值是多少?楼主你这结帖率我也不想多说了
[/Quote]
这段是通过写映射来写文件啊,每次写256K
回复
char* buff = new char[piecesize];
memset(buff, 0xff, piecesize);
memcpy(pbFile,buff,piecesize);
delete[] buff;
这段问题太大,没看出buff有什么用,piecesize每次取值是多少?楼主你这结帖率我也不想多说了
回复
linyanxin2007 2011-07-22

LARGE_INTEGER liOffset = {0};
int* iarray = new int[uiPieceNum];
RandomIntArray(iarray, uiPieceNum); //得到一个随机数序列,按该序列来写满
for (int i = 0; i < uiPieceNum; i++)
{
int index = iarray[i];
liOffset.QuadPart = index;
liOffset.QuadPart *= PIECESIZE;
//获取欲写入的字节数
piecesize = PIECESIZE; //#define PIECESIZE (256*1024)
if (index + 1 == uiPieceNum && filesize%PIECESIZE != 0)
{
//获取最后一块的大小
piecesize = (unsigned int)(filesize%PIECESIZE);
}

//创建视图并写视图
PBYTE pbFile = (PBYTE)MapViewOfFile(hFileMapping,
FILE_MAP_WRITE,
(DWORD)(liOffset.HighPart),
(DWORD)(liOffset.LowPart),
piecesize);
if (NULL == pbFile)
{
cout << "MapViewOfFile error: " << GetLastError() << endl;
CloseHandle(hFileMapping);
return false;
}

char* buff = new char[piecesize];
memset(buff, 0xff, piecesize);
memcpy(pbFile,buff,piecesize);
delete[] buff;
if (!UnmapViewOfFile(pbFile))
{
cout << "UnmapViewOfFile error: " << GetLastError() << endl;
CloseHandle(hFileMapping);
return false;
}

}
CloseHandle(hFileMapping);
基本代码如上,不知道是不是资源没释放的原因
回复
[Quote=引用 2 楼 babilife 的回复:]
楼主换成技术问题,保证回答的人多、
另外理论值好像也就能写到3G,剩下的要和系统抢内存了
[/Quote]
内存映射没这个限制吧,每次映射256K,使用完后释放。运行时内存应该只比256K多一点才对。
回复
是不是你映射的内存没释放?你看下程序运行时任务管理器里进程的内存是不是一直在增加
回复
楼主换成技术问题,保证回答的人多、
另外理论值好像也就能写到3G,剩下的要和系统抢内存了
回复
bdmh 2011-07-22
要看具体代码,应该是你控制的不好
回复
相关推荐
发帖
其它技术问题
创建于2007-09-28

3849

社区成员

C/C++ 其它技术问题
申请成为版主
帖子事件
创建了帖子
2011-07-22 10:57
社区公告
暂无公告