我有一個應用程序通過網絡接收數據塊,並將這些數據寫入磁盤。 一旦收到所有塊,它們可以被解碼/重組到他們實際表示的單個文件中。何時使用內存映射文件?
我想知道是否使用內存映射文件是有用的 - 第一個用於將單個塊寫入磁盤,第二個用於解碼全部文件的單個文件。
我自己的感覺是,它可能只對第二種情況有用,任何人都有這方面的想法?
編輯: 這是一個C#應用程序,我只計劃一個x64版本。 (因此遇到'最大的可疑空間'問題應該是不相關的)
我有一個應用程序通過網絡接收數據塊,並將這些數據寫入磁盤。 一旦收到所有塊,它們可以被解碼/重組到他們實際表示的單個文件中。何時使用內存映射文件?
我想知道是否使用內存映射文件是有用的 - 第一個用於將單個塊寫入磁盤,第二個用於解碼全部文件的單個文件。
我自己的感覺是,它可能只對第二種情況有用,任何人都有這方面的想法?
編輯: 這是一個C#應用程序,我只計劃一個x64版本。 (因此遇到'最大的可疑空間'問題應該是不相關的)
內存映射文件是用於其中需要被重複訪問的一個相當大的文件的相對小的部分(視圖)的方案是有益的。
在這種情況下,操作系統可以幫助優化通過尋呼應用的總體內存使用和分頁行爲和退出的只是映射文件的最近使用的部分。
此外,存儲器映射文件可以暴露有趣的特性如寫入時複製或用作共享存儲器的基礎。
對於您的情況,內存映射文件可以幫助您組裝文件,如果塊到達不按順序。但是,您仍然需要提前知道最終的文件大小。
另外,您應該僅訪問一次文件,以便寫入塊。因此,與顯式實現的異步I/O相比,性能優勢不太可能,但是正確實現文件編寫器可能更容易,更快捷。
In。NET 4中,Microsoft增加了對內存映射文件的支持,並且還有一些帶有示例代碼的綜合性文章,例如http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx。
我不同意mmf只適用於小視圖。在64位系統上,您可以輕鬆地查看整個文件。重新定位視圖是一項昂貴的IO操作。 – 2009-12-07 13:15:58
你說得對。它們可以用於任意大或全文視圖,特別是在64位地址空間上。但這並不是他們發光的地方,特別是當文件只被讀取或寫入一次時。我的觀點是,在這種情況下,異步I/O將同樣高效,但難以正確實現。 – user33675 2009-12-07 21:59:57
我想說這兩種情況都是相關的。簡單地將單個塊寫入內存映射文件中的適當位置,當它們進來時,它們不按順序排列。這當然只有在您知道每個塊應該放在哪裏時纔有用,就像在bittorrent下載器中一樣。如果您必須執行一些額外的分析以瞭解區塊的位置,則內存映射文件的優勢可能不會太大。
內存映射文件主要用於進程間通信或I/O性能改進。
就你而言,你是否想要獲得更好的I/O性能?
討厭指出obivious,但維基百科給出的狀況很破敗...... http://en.wikipedia.org/wiki/Memory-mapped_file
具體...
內存映射方法都有其輕微頁面錯誤成本 - 當一個數據塊加載到頁面緩存中,但尚未映射到進程的虛擬內存空間時。根據具體情況,內存映射文件I/O實際上可能比標準文件I/O慢得多。
這聽起來像你即將過早優化速度。爲什麼不使用常規的文件方法,然後在需要時重構MM文件?
我的目標是提高IO性能。 我現在正以12MB /秒左右的速度獲得數據(但將來會更多),並且需要能夠儘快處理/將其寫回磁盤。 我已經閱讀了維基百科的文章,並且我明白閱讀的好處,但是寫*文件的最佳用途和好處並不完全清楚,這就是爲什麼我要求理解它的原因: ) – Pygmy 2009-12-07 11:41:02
良好的通話,我編輯了我的文章詳細說明 - 這將是一個x64專用的應用程序。 – Pygmy 2009-12-07 10:51:20
你認爲使用MM文件會給你什麼好處? – 2009-12-07 10:52:50
速度通常不是mmap文件的主要優勢嗎? – 2009-12-07 11:00:18