2009-04-28 35 views
2

我有一項服務負責收集不斷更新的網絡數據流。意圖是整個數據集必須隨時可用(只讀)。這意味着到達最早的最新數據消息應該可以被客戶端代碼訪問。內存映射文件對不斷變化的數據有害嗎?

當前的計劃是在Windows上使用內存映射文件。主要是因爲數據集非常龐大,跨越數十個GiB。無法知道需要哪部分數據,但在需要時,客戶可能需要隨意跳轉。

內存映射文件符合法案。不過,我已經看到它說(書面),他們是最好的數據集已被定義,而不是不斷變化。這是真的?我上面描述的場景能否與內存映射文件合作良好?

或者我最好保留所有數據的內存映射文件,最多數據量爲MB,因此內存映射文件保留了傳入數據歷史的近99%,但是我將最新的,比如100MB的獨立內存緩衝區。每當這個緩衝區變滿時,我將它移動到內存映射文件,然後清除它。

回答

1

任何已定義且不會更改的數據集是最好的!
內存映射文件一般險勝參選其他 - 大多數操作系統將緩存在內存中的訪問反正。 性能將是可預測的,當你開始交換時,你不會掉下懸崖。

+0

因此,這是投票將最近〜約MB分成輕量級的內存緩衝區,並且只在緩衝區接近容量時纔會週期性添加? – ApplePieIsGood 2009-04-28 04:17:10

+0

沒有這是一個投票把整個東西放入內存映射文件,並讓操作系統緩存機制擔心它 – 2009-04-28 14:50:05

1

聽起來像一個數據庫適合您的描述。分頁是大多數商業廣告的特點。

+0

商業數據庫有太多的開銷,並會比這將實現更慢。這本質上是一個高度量身定製的內存數據庫,適用於不同的狹窄問題域。問題是,它應該爲最近更改的數據部分使用單獨的緩衝區,還是應該全部位於一個mem映射文件中。 – ApplePieIsGood 2009-04-28 04:16:26

1

從您的問題聲明,我看到下列要求:

  1. 數據必須始終可供
  2. 數據被寫入一次,我以爲這是隻追加,從來沒有被覆蓋。
  3. 數據讀訪問模式是隨機的,即跳來跳去
  4. 那裏也似乎具有一個隱含的等待時間要求

在我看來,存儲器映射文件被選擇,以解決3)+ 4)。如果你的數據大小可以適應內存,這可能是一個合理的解決方案。但是,如果您的數據大小太大而無法放入內存,內存映射文件可能會因頻繁頁面錯誤而導致性能問題。

你沒有描述如何「跳來跳去」就完成了。如果能夠建立一個索引,你可以將數據保存到多個文件,保持指數的內存,使用索引來加載數據和服務,並緩存最經常使用的數據。其基本思想與基於磁盤的散列相似。這可能是一個更具可擴展性的解決方案。

0

既然你這個標記的Win32我假設你正在處理一個32位的機器,在這種情況下,你根本就沒有足夠的地址空間來存儲地圖所有數據集上。這意味着當你「跳來跳去」時,你將不得不創建和銷燬映射到文件中,這會使得效率低於預期。

在實踐中,通常有一點超過1 GB的連續的地址空間,內存中的文件映射到在32位Windows中,你可以用更少的結束,如果你破壞你的地址空間。

這就是說,如果你的內存(而不是地址空間)受到限制,那麼使用內存映射做這件事會有好處,因爲當你的內存映射一個文件爲只讀時(而不是明確地將它讀入內存)在文件系統緩存中不會有第二個副本。

0

該文件可以作爲只讀映射到呈現數據的一個線程中,並具有一個後臺工作線程,該線程將文件映射爲readwrite以進行附加操作。