前面进行内存映射的工作省略....
下面是创建视图,并进行访问:
while (qwFileOffset < m_qwFileSize)
{
//创建视图映射
m_lpbMapAddr = (LPBYTE)MapViewOfFile(m_hFileMap,
FILE_MAP_ALL_ACCESS,
(DWORD)(qwFileOffset >> 32),
(DWORD)(qwFileOffset & 0xFFFFFFFF),
m_dwBlockSize
);
if (!m_lpbMapAddr)
{
TRACE(_T("映射文件映射失败,错误代码:%drn"),GetLastError());
return ;
}
// 对映射的视图进行访问
DWORD i = 0;
while(i < m_dwBlockSize)
{
CString DataStr(_T(""));
while(*(m_lpbMapAddr + i) != 10 && *(m_lpbMapAddr + i) != 13 && *(m_lpbMapAddr + i))
{
DataStr += *(m_lpbMapAddr + i);
++i;
}
......
问题就出在:
CString DataStr(_T(""));
while(*(m_lpbMapAddr + i) != 10 && *(m_lpbMapAddr + i) != 13 && *(m_lpbMapAddr + i))
{
DataStr += *(m_lpbMapAddr + i);
++i;
}
每次读入一个字节,就得构造一个CString对象.非常慢.失去了内存文件映射速度快的优点,反而比一般方法慢很多!真的.我测试过.慢2-3倍!
我是想每次读入一行,并存放在一个CString对象中.然后再进行后续工作.哪位能帮帮忙?谢谢了!
CString DataStr(_T(""));
放到第一个循环外边不可以吗
在里边清一下DataStr=_T("");
同意楼上
还有 不用 CString 用char buf[]数组 速度更快.
前面判断回车换行的地方写错了,修改如下:
const char* _get_line(const char* buf, int* len)
{
const char* tmp = buf;
while(*tmp && (*tmp != 0x0d || *tmp != 0x0a)) ++tmp;
*len = tmp - buf; //
if (*tmp == 0) return NULL;
//跳过回车换行符
//如果你能够保证是Windows风格的回车换行,则可以直接写作 tmp += 2;
if (*tmp == 0x0d){ // Windows style New-Line 0x0d 0x0a
tmp += 2;
assert(*(tmp-1) == 0x0a);
}else{ // Unix style New-Line 0x0a
++tmp;
}
return tmp;
}
内存映射文件不是很懂,
想借楼主此贴请教一个问题:(楼主莫怪^_^)
如果是小数据量,
直接读到缓冲区,
是不是应该比内存映射文件快啊?
内存映射的好处是在一些应用领域,比如数据库方面,或者海量数据的结构组织方面。
而楼主这个地方从映射文件中然后转化,就失去了映射的意义了。
如果需要读的话,可以自己写一个函数啊,因为传统的sscanf这个他返回值是匹配成功的数量,而不是字节数。
如果是小数据量,
直接读到缓冲区,
是不是应该比内存映射文件快啊?
--------------------
内存映射文件 功能很强大
主要用在 进程间通信 等方面....可以看 <<Windows核心编程>> 里面有说明.
内存映射适合大数据量的读取
用内存映射来读文件,完全是大才小用,而且不一定能够节省时间。
一般在数据库之类的地方可以使用...
自己写数据库哟.
up
将保存着,改天看,回房了。呵。。