管理方法 內(nèi)存映射文件的原理?
內(nèi)存映射文件的原理?通俗點(diǎn)就是ReadFile和WriteFile這樣的I/O系統(tǒng)函數(shù)你學(xué)VC的總知道吧 在文件里來(lái)回地讀、寫(xiě)、移動(dòng)文件指針效率低 速度慢,CreateFileMapping函數(shù)允許應(yīng)
內(nèi)存映射文件的原理?
通俗點(diǎn)就是ReadFile和WriteFile這樣的I/O系統(tǒng)函數(shù)你學(xué)VC的總知道吧 在文件里來(lái)回地讀、寫(xiě)、移動(dòng)文件指針效率低 速度慢,CreateFileMapping函數(shù)允許應(yīng)用程序把文件映射到一個(gè)進(jìn)程,這樣文件內(nèi)的數(shù)據(jù)就可以用內(nèi)存讀/寫(xiě)指令來(lái)訪問(wèn),簡(jiǎn)單多了 實(shí)用多了。這個(gè)不帶術(shù)語(yǔ)很難免的。。。再通俗點(diǎn)。。就是比如 要讀取一個(gè)文件里的東西 這時(shí)候你就得去硬盤(pán)讀,但是映射到內(nèi)存后 就可以直接對(duì)這塊內(nèi)存操作了;寫(xiě)操作也一個(gè)意思。。。。。就是把要在硬盤(pán)上搞的東西 弄到內(nèi)存搞 搞起來(lái)方便 不用脫褲子直接就能搞。
給你一個(gè)含有1億個(gè)QQ號(hào)碼的文件,如何快速的查找某個(gè)QQ號(hào)碼?
記得可以編一個(gè)程序,好像是找定點(diǎn)字的那種。我就是記不住,人真的很笨。
內(nèi)存映射文件存儲(chǔ)空間不夠?
設(shè)一個(gè)偏移量,不要映射那么多。下面是別人的處理方法,抄來(lái)給你:使用內(nèi)存映射文件處理大文件的代碼示例:
1 SYSTEM_INFO sinf
2 GetSystemInfo(&sinf)
3
4 // Open the file for reading and writing.
5 HANDLE hFile = CreateFile(pszPathname, GENERIC_WRITE | GENERIC_READ, 0,6 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL)7 if (hFile == INVALID_HANDLE_VALUE) {8 chMB("File could not be opened.")9 return(FALSE)10 }11 12 // Get the size of the file (I assume the whole file can be mapped) in bytes.13 DWORD dwFileSize = GetFileSize(hFile, NULL)14 15 // Create the file-mapping object.16 HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE,17 0, dwFileSize, NULL)18 if (hFileMap == NULL) {19 chMB("File map could not be opened.")20 CloseHandle(hFile)21 return(FALSE)22 }23 24 DWORD map_data_offset = 025 DWORD bytes_mapped = sinf.dwAllocationGranularity26 PVOID pvFile = NULL27 PSTR ps_ptr = NULL28 29 while(dwFileSize > 0)30 {31 if(dwFileSize
進(jìn)程間通信,內(nèi)存映射和共享內(nèi)存的區(qū)別?
內(nèi)存映射文件是利用虛擬內(nèi)存把文件映射到進(jìn)程的地址空間中去,在此之后進(jìn)程操作文件,就像操作進(jìn)程空間里的地址一樣了,比如使用c語(yǔ)言的memcpy等內(nèi)存操作的函數(shù)。這種方法能夠很好的應(yīng)用在需要頻繁處理一個(gè)文件或者是一個(gè)大文件的場(chǎng)合,這種方式處理IO效率比普通IO效率要高
共享內(nèi)存是內(nèi)存映射文件的一種特殊情況,內(nèi)存映射的是一塊內(nèi)存,而非磁盤(pán)上的文件。共享內(nèi)存的主語(yǔ)是進(jìn)程(Process),操作系統(tǒng)默認(rèn)會(huì)給每一個(gè)進(jìn)程分配一個(gè)內(nèi)存空間,每一個(gè)進(jìn)程只允許訪問(wèn)操作系統(tǒng)分配給它的哪一段內(nèi)存,而不能訪問(wèn)其他進(jìn)程的。而有時(shí)候需要在不同進(jìn)程之間訪問(wèn)同一段內(nèi)存,怎么辦呢?操作系統(tǒng)給出了創(chuàng)建訪問(wèn)共享內(nèi)存的API,需要共享內(nèi)存的進(jìn)程可以通過(guò)這一組定義好的API來(lái)訪問(wèn)多個(gè)進(jìn)程之間共有的內(nèi)存,各個(gè)進(jìn)程訪問(wèn)這一段內(nèi)存就像訪問(wèn)一個(gè)硬盤(pán)上的文件一樣。而.Net 4.0中引入了System.IO. MemoryMappedFiles命名空間,這個(gè)命名空間的類(lèi)對(duì)windows 共享內(nèi)存相關(guān)API做了封裝,使.Net程序員可以更方便的使用內(nèi)存映射文件。