2013-03-06 98 views
0

我目前正試圖讓我的頭繞着內存映射文件,並可能在我的應用程序中實現它們。內存映射文件的使用

應用程序使用一系列大型輸入文件來查找位置 - 當應用程序在單個線程中使用時,每個文件都按順序訪問,我想這會變成更隨機的訪問區域 - 這使得MMF看起來很有價值。

我對使用有點困惑 - 但我應該在每個線程中新建一個MMF嗎?我知道他們可以共享相同的底層文件,所以看起來好像我希望跨所有線程使用同一個文件,然後只是爲每個線程創建一個視圖到該MMF中。

如果我只應該爲每個文件創建一個文件,有沒有一種方法可以測試MMF是否已經創建 - 通過指定的名稱或其他方式來防止嘗試打開多個映射到相同的文件或者我需要知道哪些文件將在線程中使用並傳入已經創建的實例以防止重複?

乾杯。

回答

2

如果每個線程專用於一個文件,那麼讓每個線程爲正在處理的一個文件創建自己的MMF是有意義的。僅由單個線程使用的資源更易於在線程內分配和銷燬。但是,如果所有線程都從同一個文件讀取,那麼您不希望創建多個MMF,因爲所有將要執行的操作都會乘以消耗的內存量並創建一致性問題(多個視圖相同文件的一部分)。

對於在同一文件上運行的多個線程,您應該創建一次MMF並與多個線程共享MMF指針。

在多線程情況下按需分配會變得非常複雜,通常歸結爲需要鎖定對受保護資源的每次訪問。如果需要鎖定,則可以快速打敗運行多個獨立線程的任何性能優勢,前提是它們都必須排隊並等待訪問共享資源。

如果您可以在構建/啓動線程之前分配共享資源,那麼您通常不需要鎖定訪問資源,因爲資源總是在線程需要它時出現。

所以,我會考慮在線程啓動之前分配MMF,並在沒有鎖的情況下在所有線程之間共享MMF指針。

這也假定該文件是嚴格只讀的 - 多個線程永遠不會寫回文件或MMF。多線程可以共享一個指向公共內存區域/ MMF的指針,以進行只讀訪問,而不存在任何線程併發問題。

與傳統緩衝文件訪問相比,要小心您對MMF性能的假設。如果您的整個文件數據適合可用的RAM,那麼MMF對於隨機訪問模式的表現可能比緩衝文件I/O更高。如果文件數據比可用RAM大得多,那麼與使用MMF相比,緩衝文件I/O對於隨機訪問可以更高性能。爲什麼?因爲MMF對內存的使用很貪心。 MMF只能以4k頁大小的塊加載數據。緩衝文件I/O可以更精確地根據您的實際數據大小需求和模式進行調整。如果您的應用程序從文件中的100個不同的廣泛分隔的位置加載512字節的數據,則即使您只需要512 * 100 = 50k的數據,MMF也必須加載4k * 100 = 400k字節的數據。在這種數據訪問模式/用例中,MMF比傳統文件I/O需要多10倍的數據傳輸和內存消耗。

MMF的主要吸引力往往是開發者的便利,而不是原始的表現。從MMF支持的指針讀取對於開發人員來說通常比​​編寫和調整面向塊的文件I/O子系統更方便。只要您承認這一事實,使用這種技術就沒有問題,因爲它對開發人員來說簡單方便。

+0

感謝您的徹底解答!我純粹處理閱讀文件,這不是一個問題,我被要求看看MMF在我的特定實例中的影響,所以我會嘗試並儘可能多地實現它,以便理解和好奇。道歉,如果我誤解,你說我最好通過一個指針,MSDN文章使用「OpenExisting」在創建時給出的名稱 - 有沒有辦法測試是否存在該名稱的MMF?我不知道我將使用哪些文件,直到我已經進入線程爲止,因爲它現在寫入的時間太晚了。 – 2013-03-06 17:09:30

+0

對不起,指針參考 - 舊的Win32本地代碼習慣很難實現。 ;> – dthorpe 2013-03-06 21:00:13

+1

我的建議是,如果所有線程都將使用同一個文件並且只讀取數據,那麼您可能在所有線程中只使用一個MMF實例。例如,在線程啓動之前調用MMF.CreateFromFile一次,並將該MMF對象實例與所有線程共享 - 例如,將MMF對象填充到線程可以到達的靜態變量中。如果您不打算使用MMF的多個視圖,那麼您可能也可以在所有線程中共享一個視圖。 – dthorpe 2013-03-06 21:04:06

0

進程的線程總是共享相同的地址空間,這意味着每個線程都可以訪問整個進程的「全局」對象和資源。

您將需要在進程中同步對文件的訪問。在每個線程中重新打開文件沒有多大意義,特別是在談論「更大」的數量(幾MB)時。 MSDN提供了關於您的主題的文章,希望它有幫助。

+0

MSDN文章使用「OpenExisting」 - 如果你知道該文件已經存在,這個工作原理,在我的情況下,我不知道我會需要什麼。 有什麼方法可以測試文件是否已經打開? – 2013-03-06 16:38:17

+0

對此,您需要使用FileStream.Open()進行檢查。 [這裏](http://stackoverflow.com/questions/876473/is-there-a-way-to-check-if-a-file-is-in-use)是SO的一個條目。 – 2013-03-06 16:43:48