您的位置:首页 > 其它

统计一个大文本行数的几种方法以及效率统计(二)

2011-01-24 16:33 537 查看

.NET4.0+MemoryMapping+ReadByte()

该方法的思路主要是通过内存映射的原理,访问文件内容,由于在.net环境下不能一次性映射太大的文件,所以仍然采用分块映射的方式:

主要代码如下:

///<summary> ///MemoryMapping+ReadByte() ///</summary> unsafestaticvoidCalulateLine_MemoryMapping_ReadByte(uintoneBlockSize) { conststringFILE_MAPPING_NAME="~MappingTemp"; constintLINE_MIN_SIZE=30; longlineCount=0; IntPtrfileHandle=ShareMemory.CreateFile( FILE_NAME, ShareMemory.GENERIC_READ|ShareMemory.GENERIC_WRITE, FileShare.Read|FileShare.Write, IntPtr.Zero, FileMode.Open, ShareMemory.FILE_ATTRIBUTE_NORMAL|ShareMemory.FILE_FLAG_SEQUENTIAL_SCAN, IntPtr.Zero); uintfileSize=ShareMemory.GetFileSize(fileHandle,IntPtr.Zero); if(ShareMemory.INVALID_HANDLE_VALUE!=(int)fileHandle) { IntPtrmappingHandle=ShareMemory.CreateFileMapping( (int)fileHandle, IntPtr.Zero, ShareMemory.PAGE_READWRITE, 0, 0, FILE_MAPPING_NAME); if(mappingHandle!=IntPtr.Zero) { uintmapFlag=0; while(mapFlag<=fileSize) { uinteachMappingSize=oneBlockSize; if(fileSize-mapFlag<oneBlockSize) { eachMappingSize=fileSize-mapFlag; } IntPtrpHead=ShareMemory.MapViewOfFile( mappingHandle, (uint)(ShareMemory.FILE_MAP_READ), 0, mapFlag, eachMappingSize); intlastError=ShareMemory.GetLastError(); if(pHead!=IntPtr.Zero) { longflag=0; while(flag<eachMappingSize) { //byte*pbHead=(byte*)pHead; //bytetemp=*(pbHead+flag); bytetemp=Marshal.ReadByte((IntPtr)((int)pHead+flag)); if(temp==0x0D) { lineCount++; flag+=LINE_MIN_SIZE; } flag++; } ShareMemory.UnmapViewOfFile(pHead); } mapFlag+=oneBlockSize; } ShareMemory.CloseHandle(mappingHandle); } ShareMemory.CloseHandle(fileHandle); } }
测试结果:





.NET4.0+MemoryMapping+Unsafe

使用unsafe代码,就是在上面代码的基础上,做了一些简单的修改。

byte*pbHead=(byte*)pHead; bytetemp=*(pbHead+flag);

测试结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: