成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET 4.0內存映射文件詳解

開發 后端
在.NET4.0中,使用內存映射文件可適用于所有沒有直接使用Windows APIs管理代碼的開發者們。.NET 4.0內存映射文件或是文件映射的想法就是將文件加載到內存中,這樣它會作為一個連續塊在你的應用程序的地址空間中出現。

如果你有Windows API開發背景,你會意識到一種老技術叫做內存映射文件(memory-mapped files,有時所寫成MMF)。內存映射文件或是文件映射的想法就是將文件加載到內存中,這樣它會作為一個連續塊在你的應用程序的地址空間中出現。然后,讀取和寫入文件是訪問正確內存位置的最簡單方法。事實上,當操作系統加載器獲取你應用程序的EXE或DLL文件來執行它們的代碼的時候,文件映射會在幕后被使用。

使用來自.NET應用程序的內存映射文件本身已不再新鮮,因為通過使用在.NET1.0中的Platform Invoke (P/Invoke),它可能使用底層操作系統APIs。但是,在.NET4.0中,使用內存映射文件可適用于所有沒有直接使用Windows APIs管理代碼的開發者們。

內存映射文件和大文件總是在開發者的思想中出現,但是沒有實際的限制來考慮到底內存可以映射多大或是多小的文件。雖然對大文件使用內存映射會使編程變得簡單,但是你會觀察到當使用更小一點的文件的時候執行得會更好,因為它們可以適用于整個文件系統緩存。

本文中的信息和代碼列表是基于2009年5月發布的.NET 4.0 Beta 1版本。由于是預發布的軟件,一旦***的.NET的RTM版本確定,所有技術細節,類名稱和方法會改變。在研究或是開發任何測試庫的時候一定要牢記這一點。

新命名空間和它的類

對于.NET4.0 開發者來說,與內存映射文件一起工作的最有趣的類是存在于新的System.IO.MemoryMappedFiles命名空間中。目前,這個命名空間包含四個類和一些列舉來幫助你訪問并保護你的文件映射。實際的執行是在集合System.Core.dll中。

對于開發者最重要的類是MemoryMappedFile類。這個類允許你創建一個內存映射對象,反過來你可以創建一個視圖訪問對象。然后你可以使用這個accessor直接操作來自文件映射的內存塊。通過使用Read 和Write方法完成這個操作。

注意的是直接指針在管理的世界中不被視為一種良好的編程習慣,這樣的方法對象是需要保持整潔的。在傳統的Windows API 開發的本地代碼中,你只會獲得一個指針來啟動你的內存塊。

盡管如此,獲取一個內存映射文件的過程和必要的accessor對象,你需要遵循三個簡單的步驟。首先,你需要一個文件流對象指向在磁盤上的(一個現有的)文件。第二,從這個文件中你可以創建映射對象,***一個步驟,你創建accessor對象。這里有一段C#代碼示例:

  1. FileStream file = new FileStream(   
  2. @"C:\Temp\MyFile.dat", FileMode.Open);  
  3.  
  4. MemoryMappedFile mmf =  
  5.  
  6. MemoryMappedFile.CreateFromFile(file);  
  7.  
  8. MemoryMappedViewAccessor accessor =  
  9.  
  10. mmf.CreateViewAccessor(); 

這個代碼首先打開帶有System.IO.FileStream類的一個文件,然后將流對象實例傳遞給MemoryMappedFile類的靜態CreateFromFile方法。第三步是調用MemoryMappedFile類的CreateViewAccessor方法。

在上面的代碼中,CreateViewAccessor方法在沒有任何參數的情況下被調用。在這種情況下,映射從文件開頭(offset零)開始,以文件的***字節為結束。你可以輕松的映射任何文件的部分。例如,如果你的文件有十億字節的大小,然后你可以映射,用以下調用可以完成:

MemoryMappedViewAccessor accessor =

mmf.CreateViewAccessor(1024 * 1024, 10000);

然后,你將看到對于這些映射視圖的更先進的使用,但是首先,你必須學習從這個視圖中讀取。

從映射文件中讀取

要使用先前的映射內存地址,你需要使用MemoryMappedViewAccessor類的方法。例如,要從文件映射的開端讀取10個字節,你應該使用ReadByte方法,如下:

  1.      ...   
  2. MemoryMappedViewAccessor accessor =  
  3.  
  4. mmf.CreateViewAccessor();  
  5.  
  6. byte[] buffer = new byte[10];  
  7.  
  8. for (int index = 0; index < buffer.Length; index++)  
  9.  
  10. {  
  11.  
  12. buffer[index] = accessor.ReadByte(index); 

這個Read方法或者可以填入給出的一般對象的內容,或者可以通過使用泛型 Read or ReadArray而采取更具體的對象。例如,假設你有一個Guid類型的對象(定義為一個結構),然后兩個ReadNNN方法調用,以下有相似的結果:

  1.      // method 1:   
  2.   byte[] buffer = new byte[16];  
  3.  
  4.   accessor.ReadArray(0, buffer, 0, buffer.Length);  
  5.  
  6.   Guid guid = new Guid(buffer);  
  7.  
  8.   MessageBox.Show(guid.ToString());  
  9.  
  10.   // method 2:  
  11.  
  12.   Guid guid2 = new Guid();  
  13.  
  14.   accessor.Read(0, out guid2);  
  15.  
  16.   MessageBox.Show(guid2.ToString());  

注意的是在兩個Read方法調用中,你需要指定讀取開始的位置。這個基于零的offset與映射視圖總是相對的,但不一定是原始文件。當你創建內存映射對象的時候,你需要指定你想要操作文件(圖1)的內存窗口。如果你沒有指定任何的offset,像是以上代碼列表中的,然后該視圖被假定是從文件的開端開始的。

 View offsets總是與mapped view相對

為了幫助提供靈活性,你可以從零offset開始并運行直到文件的長度或你可以從中間開始,并只映射文件的一部分。通過offsets相對視圖,accessor對象的讀取就可以完成。也就是說,原始文件的offset成為view的 起始offset加上view offset。

要記住內存映射對象和文件下有操作系統處理。因此,重要的是要記住在完成它們之后要處理這些對象。否則它們將保留無限大的開放時間直到垃圾回收的進入。***的辦法就是使用try-finally blocks或是使用C#語句。

如果你用.NET流對象工作非常開心,但是仍然希望從內存映射文件中受益,那么你就是幸運的。MemoryMappedFile類包含一個很方便的方法叫做CreateViewStream,,可以返回一個MemoryMappedViewStream對象。這個對象允許序列訪問映射視圖;這個可能是使用映射視圖流(mapped view streams)與使用允許隨即訪問的accessor對象相比的***缺點。但是如果你不介意這個局限,CreateViewStream方法就是你的朋友。

 

【編輯推薦】

  1. .NET 4.0中WCF服務配置的簡化與改進
  2. 詳解.NET 4.0中的契約式編程
  3. 詳解.NET 4.0代碼契約組件
  4. .NET 4.0新特性:C#和VB.NET的取長補短
  5. .NET 4.0 Beta 1將為PLINQ帶來生機?
責任編輯:佚名 來源: IT專家網
相關推薦

2009-08-13 14:21:04

.NET內存映射文件

2009-12-30 10:21:36

.NET 4.0

2010-07-02 09:25:37

.NET 4.0可擴展

2009-12-18 09:38:27

.NET 4.0并行計

2009-12-28 10:04:59

.NET 4.0數組

2009-03-04 09:52:35

代碼契約組件接口

2009-12-04 09:14:05

.NET 4.0

2009-03-23 10:54:12

.NET契約式編程編程思想

2009-08-26 14:52:19

.NET Framew

2010-01-05 09:26:13

.NET 4.0

2011-04-25 17:15:39

MongodbMMAP

2012-06-20 14:16:36

Java內存映射

2009-10-26 09:16:08

BigInteger類

2009-09-02 09:23:26

.NET內存管理機制

2009-08-10 18:16:33

ICustomQuer.NET 4.0

2018-05-18 09:07:43

Linux內核內存

2021-04-27 13:56:49

內存.映射地址

2009-07-21 15:38:31

2023-08-03 07:30:01

JavaNIO庫

2009-09-27 10:03:53

Silverlight
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜精品一区二区三区在线观看 | 亚洲视频 欧美视频 | 久久免费国产 | 国产乱码精品1区2区3区 | 99久久婷婷 | 欧美精品网站 | 337p日本欧洲亚洲大胆鲁鲁 | 日韩一级欧美一级 | 久久久久久久一区二区三区 | 国产精品成人av | 免费国产一区二区视频 | 亚洲嫩草| 久久久国产网站 | 精品成人一区二区 | 亚洲国产成人精品在线 | 国产一区二区日韩 | 日韩成人av在线 | 91免费版在线观看 | 超碰成人在线观看 | 国产一区二区日韩 | 久久久91精品国产一区二区精品 | 一本一道久久a久久精品综合蜜臀 | 精品一区二区三区在线播放 | 一级视频在线免费观看 | 久草www | 欧美二区在线 | 国产乱码久久久久久一区二区 | 欧美视频一区二区三区 | 国产精品成av人在线视午夜片 | 毛片毛片毛片毛片毛片 | 国产福利资源在线 | 欧美日韩综合 | 福利一区在线观看 | 久草福利 | 国产精品视频一二三 | 中国一级毛片免费 | 99国产精品视频免费观看一公开 | 国产日韩欧美中文 | 极品粉嫩国产48尤物在线播放 | 精品久久久久久亚洲综合网 | 欧美一区二区三区大片 |