hur.cn - 华软网

 热门搜索

内存映射文件的问题

  作者:未知    来源:网络    更新时间:2011/4/13
大家好,做股票项目进程中遇到一个问题:
咱们系统通过特定的工具,直接从网上下载行情到一个行情资料,资料实时更新(基本上一两秒更新一次)。然后本系统和其它系统的N个组件会来读取这个行情资料。另外系统怎么做的不知道,咱们系统用的是内存映照资料去读。如果我单人去读这个资料,那更新良好,资料被更新了我系统内马上能获得更新后的数据。然则如果大家一起来读这个资料,他人都能正确读到,但我的程序虽然也能读到数据,然则数据更新很少,有时候几十分钟都不会读到新的数据(资料肯定是更新了的),这是为什么,大家有经验吗?

代码
int CDBF::Open(const char* filename)
{
HANDLE hFile = CreateFile(filename,
GENERIC_READ,
FILE_SHARE_WRITE|FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);    

if (hFile == INVALID_HANDLE_VALUE)
{
//CHSLog::GetHSLog()->hsDebugPerform("创建dbf资料失利...");
cout << "创建dbf资料失利..." << endl;
return RET_ERR;
}

//在创建映照对象资料需要判断hfile的长度是否为0
HANDLE hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);

if (hFileMapping == NULL)
{
//CHSLog::GetHSLog()->hsDebugPerform("创建dbf资料映照失利...");
cout << "创建dbf资料映照失利..." << endl;
return RET_ERR;
}

m_dbfBuffer = (unsigned char*)MapViewOfFile( hFileMapping, FILE_MAP_READ, 0, 0, 0 );

memcpy( (void*)&m_dbfFileHeader, m_dbfBuffer, sizeof(DBFFILEHEADER) );

CloseHandle(hFileMapping);

CloseHandle(hFile);

return RET_OK;
}
---华软 网友回答---
好像没有及时调用UnmapViewOfFile()。。。内存空间没有卸载
---华软网友回复---
你直接从资料影射的。
资料难道也是实时更新的?

我觉得你这个模块是应该这样的。
主程序创建一个以资料为基础的内存映照,Createfilemapping。然后实时更新内存。
每隔一段时间内存更新到资料。调用FlushViewOfFile。

所以,你应该直接打开一个创建好的内存映照。
openfilemapping直接访问内存,才能获得实时更新数据。
---华软网友回复---
我对你的行情数据源感兴趣
---华软网友回复---
To1楼:我马上试一下你的方法,我昨天也这么想过。
To2楼:我是有用Createfilemapping创建一个内存映照,然则我这个程序只需读不用写,所以不用FlushViewOfFile吧?你的意思是否是说,只需创建一次Createfilemapping,然后以后每次用的时候就openfilemapping访问?其它程序更新了资料,系统能自动更新到内存中么?
To3楼:行情源不是公网上的,是券商或基金公司内部的。
---华软网友回复---
增补:主帖中的open函数我会在一个线程中循环调用,大根半秒一次.
这段代码在独自读取一个资料(没有其它人再读这个资料)时,一切都是OK的,
然则如果有多人同时来读取这个资料就不OK了.
---华软网友回复---
自己顶起
---华软网友回复---
CreateFile中标
FILE_SHARE_WRITE|FILE_SHARE_READ

是否他人用0,限制了你的权利?
---华软网友回复---
个人觉得楼主的这类需求不适宜用内存映照资料来措置惩罚了,除非资料很庞大,措置惩罚需要很多I/O时间。直接用CreateFile/ReadFile/WriteFile 岂不直接
---华软网友回复---
不论怎么说,大家都自己CreateFileMapping是不可取的。
都已经失去了内存资料映照的意义了。跟我楼上地说得差不多。

你们应该创建一个主程序,来CreateFileMaping,定期把数据读到内存。
其余的程序直接OpenFileMapping就能够了,直接访问内存,不用访问资料,也会防止资料访问冲突。

你现在的现象预计是资料访问冲突引起的。

---华软网友回复---
http://blog.csdn.net/yiruirui0507/archive/2011/03/31/6293073.aspx
内存映照资料你理解的不到位吧      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。