内存映射读取几G的txt文件?

时间:2021-06-21 17:21:41
我用内存映射的方法读取几G的txt文件,txt文件的内容都是几何点信息,如-123 456 897  ,我想一行一行读取出来,前面步骤都写好咯,就是如何通过mapoffile返回的指针一行一行读取
CFileDialog fileDlg(TRUE,_T("*.txt"),_T("*.txt"),NULL,_T("文本文件(*.txt)|*.txt||"),this);   
if (fileDlg.DoModal() == IDOK) 
{
SYSTEM_INFO sinf;
GetSystemInfo(&sinf);
HANDLE hFile = CreateFile(fileDlg.GetPathName(), GENERIC_WRITE | GENERIC_READ, 0,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("文件不能打开!"));
}
HANDLE hFileMaping  = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL);
if(hFileMaping  == NULL)
{

AfxMessageBox(_T("创建文件内核失败!"));
}
DWORD dwFileSizeHigh;     
__int64 qwFileSize = GetFileSize(hFile,&dwFileSizeHigh);  
qwFileSize  += (((__int64)dwFileSizeHigh)<<32);
    CloseHandle( hFile );
 __int64 qwFileOffset = 0,qwnumofos=0,numberOfVerts = 0; 
 while(qwFileSize>0)
 {
 DWORD dwbytesblock =sinf.dwAllocationGranularity;
 if (qwFileSize<sinf.dwAllocationGranularity)
 dwbytesblock=(DWORD)qwFileSize;
         PBYTE pbfile=(PBYTE)MapViewOfFile(hFileMaping,FILE_MAP_READ,0,0,0);
 //PBYTE pbfile=(PBYTE)MapViewOfFile(hFileMaping,FILE_MAP_READ,(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xffffffff),dwbytesblock);
 PSTR pchAnsi = (PSTR)pbfile;
 //记录首地址
 PSTR pchAnsi1 = (PSTR)pbfile;
 //记录首地址
 pchAnsi[qwFileSize / sizeof(char)] = 0;
 //文件占有的字节数
 pchAnsi1[qwFileSize/ sizeof(char)] = 0;
 //文件占有的字节数
 PSTR pchAnsi2 = NULL;
 //定义与地址一致的变量,用以将某个地址值赋值给它
 PSTR pchAnsi3 = NULL;
 //定义与地址一致的变量,用以将某个地址值赋值给它
 //每次读取一行文本,统计行数
//记录个数的变量
 pchAnsi2 = strchr(pchAnsi, '\n' );
 //pchAnsi 是内核中文件首地址,从这开始,
 //寻找第一次出现\n(换行)的地址,赋给 pchAnsi2
 while( pchAnsi2 != NULL )
  //判断是否到文件末尾
 {
  numberOfVerts++;
  pchAnsi = pchAnsi2 + 1;
  //地址跳过已读过的一行
  pchAnsi2 = strchr(pchAnsi, '\n');
  //寻找下一个换行符
 }

下面如何写

7 个解决方案

#1


引用 楼主 nylsirc123 的回复:
我用内存映射的方法读取几G的txt文件,txt文件的内容都是几何点信息,如-123 456 897  ,我想一行一行读取出来,前面步骤都写好咯,就是如何通过mapoffile返回的指针一行一行读取
CFileDialog fileDlg(TRUE,_T("*.txt"),_T("*.txt"),NULL,_T("文本文件(*.txt)|*.txt||"),this); ……


不可能!

一行一行的读取?你说一行有多少字节?

貌似没有规定吧。

你换个说法,一次操作多少个字节
内存映射文件可以完成每次映射多少个字节,比如系统粒度的倍数。

至于映射后,是否是你的规律,是个问题.


#2


系统的分配粒度不是随机的吗,我可以不指定吧

#3


引用 2 楼 nylsirc123 的回复:
系统的分配粒度不是随机的吗,我可以不指定吧


应用程序预定地址空间,的地址,必须是分配粒度的整数倍。
预定一块区域,是4k的倍数。


具体我也没搞定,等大神吧。



#4


本帖最后由 VisualEleven 于 2013-05-31 12:10:27 编辑
引用 3 楼 bsnry 的回复:
引用 2 楼 nylsirc123 的回复:系统的分配粒度不是随机的吗,我可以不指定吧

应用程序预定地址空间,的地址,必须是分配粒度的整数倍。
预定一块区域,是4k的倍数。


具体我也没搞定,等大神吧。


http://msdn.microsoft.com/en-us/library/windows/desktop/aa366548(v=vs.85).aspx

参考这里,映射的时候,偏移必须是系统粒度的整数倍。

或者完全偏移,直接传0

lpMapAddress = MapViewOfFile(hMapFile,            // handle to
                                                    // mapping object
                               FILE_MAP_ALL_ACCESS, // read/write
                               0,                   // high-order 32
                                                    // bits of file
                                                    // offset
                               dwFileMapStart,      // low-order 32
                                                    // bits of file
                                                    // offset
                               dwMapViewSize);      // number of bytes
                                                    // to map

#5


文件映射如果没有非常好的映射规则,其实ReadFile读大量数据处理效率其实差不太多的

#6


用双缓冲吧,一个MapFile 两个View, 遇到一个View的最后数据不是换行,另一个View 要覆盖一整行
两个View交错即可;

  |=====View1 ===============|          |=====View1 ===============|
  ===================================================== 
  |                 \n  |     \n      \n ........         |数据                                 
  ======================================================
                  |========= View2 ===========|                 

#7


引用 5 楼 tiger9991 的回复:
文件映射如果没有非常好的映射规则,其实ReadFile读大量数据处理效率其实差不太多的


文件映射,可以破除,第一次打开文件,太慢的噩梦。

#1


引用 楼主 nylsirc123 的回复:
我用内存映射的方法读取几G的txt文件,txt文件的内容都是几何点信息,如-123 456 897  ,我想一行一行读取出来,前面步骤都写好咯,就是如何通过mapoffile返回的指针一行一行读取
CFileDialog fileDlg(TRUE,_T("*.txt"),_T("*.txt"),NULL,_T("文本文件(*.txt)|*.txt||"),this); ……


不可能!

一行一行的读取?你说一行有多少字节?

貌似没有规定吧。

你换个说法,一次操作多少个字节
内存映射文件可以完成每次映射多少个字节,比如系统粒度的倍数。

至于映射后,是否是你的规律,是个问题.


#2


系统的分配粒度不是随机的吗,我可以不指定吧

#3


引用 2 楼 nylsirc123 的回复:
系统的分配粒度不是随机的吗,我可以不指定吧


应用程序预定地址空间,的地址,必须是分配粒度的整数倍。
预定一块区域,是4k的倍数。


具体我也没搞定,等大神吧。



#4


本帖最后由 VisualEleven 于 2013-05-31 12:10:27 编辑
引用 3 楼 bsnry 的回复:
引用 2 楼 nylsirc123 的回复:系统的分配粒度不是随机的吗,我可以不指定吧

应用程序预定地址空间,的地址,必须是分配粒度的整数倍。
预定一块区域,是4k的倍数。


具体我也没搞定,等大神吧。


http://msdn.microsoft.com/en-us/library/windows/desktop/aa366548(v=vs.85).aspx

参考这里,映射的时候,偏移必须是系统粒度的整数倍。

或者完全偏移,直接传0

lpMapAddress = MapViewOfFile(hMapFile,            // handle to
                                                    // mapping object
                               FILE_MAP_ALL_ACCESS, // read/write
                               0,                   // high-order 32
                                                    // bits of file
                                                    // offset
                               dwFileMapStart,      // low-order 32
                                                    // bits of file
                                                    // offset
                               dwMapViewSize);      // number of bytes
                                                    // to map

#5


文件映射如果没有非常好的映射规则,其实ReadFile读大量数据处理效率其实差不太多的

#6


用双缓冲吧,一个MapFile 两个View, 遇到一个View的最后数据不是换行,另一个View 要覆盖一整行
两个View交错即可;

  |=====View1 ===============|          |=====View1 ===============|
  ===================================================== 
  |                 \n  |     \n      \n ........         |数据                                 
  ======================================================
                  |========= View2 ===========|                 

#7


引用 5 楼 tiger9991 的回复:
文件映射如果没有非常好的映射规则,其实ReadFile读大量数据处理效率其实差不太多的


文件映射,可以破除,第一次打开文件,太慢的噩梦。