2013-07-25 36 views
0

問題在於:我有一定量的單詞(比方說20M),每個單詞都包含一些用作標誌的位;全部存儲在單個連續二進制文件中。用於存儲大量標誌集的非常大的持久性容器

我想這樣做是爲了獲得訪問這些話在容器像風格,所以container_instance[i]讓我訪問第i個字。爲了使事情變得更加複雜,我不能一次性將所有單詞存儲在內存中,必須將它們存儲迴文件和內存中,以便長時間不用的內存釋放。爲了簡化,整個序列被分割成1K個片段,所以我們需要釋放和分配這樣的1K塊。內存應在一段時間後或在訪問容器一定次數後釋放。

線程安全性很好。但我可以保護對外。

我目前的實現只根據需要分配塊(如果文件可用,則爲空或讀文件;文件不稀疏,因此文件中最後一個字節後的所有內容都分配爲空),並且不會很好地完成。根本不釋放,所以未使用的塊永遠留在內存中。

我開始考慮漂亮的解決方案,我想知道STL或Boosts中的任何元素是否可以幫助我構建這樣的容器,而不是通過從頭開始逐步雕刻它?

我不希望完全的解決方案,而不是指向「您可以使用」。

+0

'boost'是一個幫助:他們的迭代器構建東西(比如'fascade')將幫助您製作隨機訪問迭代器。 – Yakk

+1

使用64位系統和'mmap'。完成。閱讀=頁面,免費=頁面輸出。你無法擊敗與CPU一起工作的操作系統。 – MSalters

+0

我不能使用'mmap()',因爲我不得不通過包裝來訪問文件,因爲代碼不能依賴於POSIX或任何其他操作系統stuff.It就像嵌入代碼。 –

回答

0

您可以使用mmap系統調用將您的文件映射到內存中。您可以使用該緩衝區的指針算術,因此按索引訪問並不麻煩。

映射頁面是虛擬的,由內核管理,允許保存未使用的內存塊並以透明方式加載/刷新它們。此外,使用madvise可能會啓用某些優化。