簡體   English   中英

用於C ++(或C)的mmap可加載數據結構庫

[英]mmap-loadable data structure library for C++ (or C)

我有一些大型數據結構(N> 10,000),通常只需要創建一次(在運行時),之后可以多次重復使用,但需要非常快速地加載。 (它用於iPhoneOS上的用戶輸入處理。) mmap -ing文件似乎是最好的選擇。

C ++(或C)是否有任何數據結構庫? 沿線的東西

ReadOnlyHashTable<char, int> table ("filename.hash");
// mmap(...) inside the c'tor
...
int freq = table.get('a');
...
// munmap(...); inside the d'tor.

謝謝!


細節:

我自己寫了一個類似哈希表的類,但我覺得很難維護,所以我想看看是否已有解決方案。 圖書館應該

  • 包含將數據結構序列化為文件的創建例程。 這部分不需要很快。
  • 包含一個加載例程,該例程將文件映射為只能在O(1)處理步驟中使用的只讀(或讀寫)數據結構。
  • 使用O(N)量的磁盤/內存空間和一個小的常數因子。 (設備有嚴重的內存限制。)
  • 訪問者的時間開銷很小。 (即復雜性未被修改。)

假設:

  • 數據的位表示(例如字節順序, float編碼等)無關緊要,因為它僅在本地使用。
  • 到目前為止,我需要的可能的數據類型是它們的整數,字符串和struct 指針不會出現。

PS Can Boost.intrusive幫助?

您可以嘗試創建內存映射文件,然后使用客戶分配器創建STL映射結構。 然后,您的客戶分配器只需占用內存映射文件的內存的開頭,然后根據請求的大小遞增其指針。 最后,所有分配的內存應該在內存映射文件的內存中,並且應該可以在以后重新加載。

您必須檢查STL映射是否釋放了內存。 如果是,您的客戶分配器將丟失內存映射文件的一些內存,但如果這是有限的,您可以使用它。

聽起來也許你可以使用的“完美哈希”的公用事業公司之一在那里。 這些花費一些時間來優化特定數據的散列函數,因此沒有散列沖突和(對於最小的完美散列函數),因此散列表中沒有(或至少很少)空間隙。 顯然,這是為了很少生成,但經常使用。

CMPH聲稱應對大量的鑰匙。 但是,我從未使用它。

它很有可能只生成哈希函數,讓您使用它來生成數據結構。 這應該不是特別難,但它可能仍然讓你離開現在的位置 - 至少保留一些代碼本身。

GVDB(GVariant數據庫),Dconf的核心就是這個。

git.gnome.org/browse/gvdb ,dconfbv
developer.gnome.org/glib/2.30/glib-GVariant.html

剛想到另一種選擇 - Datadraw 同樣,我沒有使用過這個,所以沒有保證,但它確實聲稱是一個快速持久的數據庫代碼生成器。

WRT boos.intrusive,我剛看了一眼。 這真有趣。 而且很煩人,因為它使我自己的一個庫看起來有點無意義。

我認為這部分看起來特別相關。

如果你可以使用“智能指針”作為鏈接,大概可以使用一個簡單的從基地址偏移的整數來實現智能指針類型(我認為這是示例的重點)。 數組下標可能同樣有效。

肯定有無序的set / multiset支持(哈希表的C ++代碼)。

使用cmph會起作用。 它確實具有哈希函數本身的序列化機制,但是如果你的查詢集宇宙在手頭不知道的話,你還需要序列化密鑰和數據,除了在它上面添加一層沖突解決方案。 如果您事先知道所有鍵,那么這是一種方法,因為您不需要存儲鍵並且將節省大量空間。 如果沒有,對於這么小的一套,我會說它太過分了。

可能最好的選擇是使用谷歌的sparse_hash_map。 它具有非常低的開銷,並且還具有您需要的序列化掛鈎。

http://google-sparsehash.googlecode.com/svn/trunk/doc/sparse_hash_map.html#io

暫無
暫無

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

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