繁体   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