2008-09-29 54 views
37

我喜歡使用STL開發算法,但是,我有這種反覆出現的問題,即我的數據集對於堆太大。磁盤支持的STL容器類?

我一直在尋找STL容器和算法的磁盤替換,這些容器和算法是磁盤備份的,即存儲在磁盤上而不是堆上的數據結構。

一位朋友最近指出我朝着stxxl。在我參與其中之前......我應該考慮是否有其他支持磁盤的STL替代品?

注意:我對持久性或嵌入式數據庫不感興趣。請不要提及boost :: serialization,POST ++,關係模板庫,Berkeley DB,sqlite等。我知道這些項目,並在適合我的目的時使用它們。

更新:有幾個人都提到內存映射文件,並使用自定義分配器,好的建議BTW,但我想他們指出大衛亞伯拉罕表明,將需要對磁盤備份容器定製迭代器的討論here 。這意味着自定義分配器方法不太可能奏效。

+0

如果你的數據集對於堆太大,你應該考慮你的系統體系結構是否正確(例如,是否移動到64位系統;現在比問問題時更常見)。你還應該考慮STL是否是正確的方法;它可能會對數據集大小做出假設,而這些假設並不適合您。 – 2010-12-01 06:15:14

+0

@Donal他可能不會保留正確的內存量。 – 2011-03-09 22:58:54

回答

10

我實現了一些非常相似的東西。實現迭代器是最具挑戰性的。我用boost::iterator_facade來實現迭代器。使用boost::iterator_facade你可以將簡單適配任何緩存在磁盤數據結構有一個STL容器接口。

2

我對這個主題不太瞭解,但是可能可以寫一個類似STL的接口到內存映射文件中嗎?

編輯:如果您試圖獲取大文件的特定部分,此方法可能適用。如果您試圖對整個文件執行某些操作,則在讀取未緩存的文件部分時,可能會生成大量的頁面錯誤。

+0

我已經考慮過這樣做了......但是我寧願不要自己寫下來,如果可行的話已經完成了。 – paxos1977 2008-09-29 16:44:58

+0

我可以欣賞不想重新發明車輪。我不熟悉這樣做的圖書館;希望有人可以推薦一個。 – luke 2008-09-29 16:49:33

+0

我相信Boost.Interprocess可以用來寫入內存映射文件。但實際上並沒有嘗試過。 – 2008-09-29 17:05:14

3

如果(如您所寫)對持久性不感興趣,最簡單的解決方案是增加堆大小並使用操作系統的虛擬內存設施。堆中不適合計算機物理內存的部分最終將被分頁到磁盤上,從而爲您提供所需的內容:正常的STL訪問通常存儲在磁盤上的數據。操作系統將負責在物理內存中緩存最常用的頁面,並將你不常用的那些頁面驅逐出去。您的代碼將保持不變,您只需添加更多物理內存即可提高其性能。

要增加堆大小,請檢查操作系統的參數,例如Unix系統上的ulimit(1)和系統屬性 - 高級 - 性能 - 高級 - Windows XP上的虛擬內存。如果你已經達到32位4GB的限制,考慮轉向64位體系結構或將你的程序編譯爲64位。

8

我從來沒有像這樣做過任何事情,但可以通過編寫一個自定義分配器來完成你想要做的事情,這個自定義分配器利用內存映射文件來備份你的數據。

的文檔見boost::interprocesses他們易於使用的執行內存映射文件,this Dr. Dobbs article的寫作分配器的詳細討論,併爲this IEEE Software column問題和example code的描述。