2011-09-30 92 views
2

我正在尋找一種方法在內存中存儲數GB的數據。數據被加載到樹形結構中。我希望能夠通過我的主要功能訪問這些數據,但是我沒有興趣在每次運行程序時將數據重新加載到樹中。做這個的最好方式是什麼?我應該創建一個單獨的程序來加載數據,然後從主函數中調用它,還是有更好的選擇?將大量的數據存儲在內存中

感謝 的Mads

回答

6

我想說的最佳替代品將使用一個數據庫 - 這將是那麼你的「加載數據獨立程序」。

5

如果您使用的是POSIX兼容系統,請查看mmap

我認爲Windows有另一個功能來存儲映射文件。

+1

「如果你使用的是Linux」:'mmap()的'是POSIX,而不是隻有Linux:http://pubs.opengroup.org/onlinepubs/009695399/functions/mmap.html – Raedwald

3

你或許可以使用shared memory來解決這個問題,讓它有一個長期存在的進程構建樹併爲其提供地址,然後其他啓動的進程可以獲得同樣的查詢內存。請注意,在這種情況下,您需要確保樹正由多個同時進程讀取。如果讀數真的只是純讀數,那麼這應該很容易。

+2

此。 (或者,使用索引而不是指針並將樹存儲在磁盤上的映射文件中)。 – Damon

+0

小心從樹結構尋址共享內存中的指針。共享內存內容具有相對尋址,因此,遍歷樹指針會導致程序崩潰。爲此,Boost有一個特殊的偏移指針。 –

0

您必須運行64位系統才能使用超過4 GB的內存。如果您構建樹並將其設置爲全局變量,則可以從程序中的任何函數訪問樹和數據。我建議你也許嘗試一種需要更少內存消耗的替代方法。如果你發佈什麼類型的程序,以及你正在做什麼類型的樹,我可以給你一些幫助找到一種替代方法。

既然你不想繼續重新加載數據......文件存儲和數據庫是沒有問題的,但幾個內存的演出似乎是這樣一個沉重的代價。

另請注意,在Windows系統上,您可以使用ReadProcessMemory()訪問另一個程序的內存,您只需要一個指針用於存儲器的位置。

+0

兩個小小的注意事項:在32位Windows下映射的限制在1.3到1.4GB的正常啓動(2.3到2.4GB與/ 3G和LARGEADDRESSAWARE標誌),而不是4GB左右。另外,ReadProcessMemory是一種memcpy(在進程之間),所以它不太可能會用到。開銷將是禁止的。 – Damon

3

你應該看看一種叫做Memory mapped file的技術。

+0

+1是最簡單的解決方案之一,它也支持比RAM更大的數據。 –

0

你也可以實現數據加載器作爲一個可執行程序和主程序作爲一個DLL加載和卸載的需求。這樣您就可以將數據保存在內存中,並且可以修改處理代碼而無需重新加載所有數據或進行跨進程內存共享。另外,如果您可以對磁盤上的原始數據進行操作(而不是對其進行任何預處理(例如,將其放入樹中,操作指向其內部的指針),則可能需要對數據進行內存映射,避免加載未使用的部分。

1

我認爲最好的解決方案是配置緩存服務器並將數據放在那裏。

查找到Ehcache

的Ehcache是​​用來提高性能 ,卸載數據庫,並簡化可擴展性的開源的,基於標準的高速緩存。 Ehcache是​​ 強大,成熟和功能全面的,這使它成爲最廣泛使用的基於Java的高速緩存 。

它是用Java編寫的,但should support any language you choose

緩存服務器有兩個API:REST的資源導向,SOAP。 兩者都支持任何編程語言的客戶端。

+0

適用於開源解決方案。 – Rob