簡體   English   中英

將大量數據存儲在內存中

[英]Store huge amount of data in memory

我正在尋找一種方法來存儲幾個gb的數據。 數據被加載到樹結構中。 我希望能夠通過我的main函數訪問這些數據,但是每次運行程序時我都不想將數據重新加載到樹中。 做這個的最好方式是什么? 我應該創建一個單獨的程序來加載數據,然后從主函數調用它,還是有更好的選擇?

謝謝Mads

我會說最好的選擇是使用數據庫 - 這將是你的“用於加載數據的獨立程序”。

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

我認為Windows有另一個內存映射文件的功能。

您可以使用共享內存來解決這個問題,讓一個持久的進程構建樹並為其公開地址,然后啟動的其他進程可以獲取相同的內存以進行查詢。 請注意,在這種情況下,您需要確保樹由多個同時進程讀取。 如果讀取實際上只是純讀取,那么這應該很容易。

您應該研究一種稱為內存映射文件的技術。

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

看看Ehcache

Ehcache是​​一個基於標准的開源緩存,用於提高性能,卸載數據庫並簡化可伸縮性。 Ehcache功能強大,經過驗證且功能齊全,這使其成為最廣泛使用的基於Java的緩存。

它是用Java編寫的,但應該支持您選擇的任何語言

高速緩存服務器有兩個api:面向RESTful資源和SOAP。 兩者都支持任何編程語言的客戶端。

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

既然你不想繼續重新加載數據......文件存儲和數據庫都是不可能的,但幾次內存看起來像是一個巨大的價格。

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

您也可以將數據加載器實現為可執行程序,將主程序實現為按需加載和卸載的DLL。 這樣,您可以將數據保存在內存中,並能夠修改處理代碼,無需重新加載所有數據或進行跨進程內存共享。

此外,如果您可以對磁盤上的原始數據進行操作(無需對其進行任何預處理(例如將其放入樹中,操作指向其內部的指針),您可能需要對數據進行內存映射並避免加載未使用的部分它的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM