怎么建立一个可共享和快速查找、插入的字符串资源池?

cdo 2014-06-24 12:03:35
项目上有一个优化需求,大概的情况如下:
1.有很多字符串(字符长度在1-250间)
2.可使用的内存很小,只有大概10M左右的空间了
3.字符串资源要多个进程访问
4.能增加新的字符串,其它进程也要能访问新增量的字符串
5.查询,插入的效率要快(暂无删除和修改已存在字符串的需求)

我想把所有字符串都分配到共享内存上,如果要新增的字符串已存在,直接获取对应的指针地址,而不再重新插入。

但不知道什么样的算法,才能让字符串访问、增加效率最高,请各位大虾指点,百分感谢!
...全文
293 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2014-06-29
  • 打赏
  • 举报
回复
楼上说的都是偏理论的哈,我给楼主个工程一点的建议: 1,做一个服务,底层leveldb,,对外提供网络接口访问。 2,为了满足按增量访问,创建2个leveldb,一个是major leveldb,一个是minor leveldb,数据写入后先进入minor,客户端访问minor获取数据后后插入major。 2个leveldb的问题也很明显,就是从minor删除到major插入不是事务的,如果要保证事务安全,自己做一个redo-log,按序号递增滚动当作checkpoint就可以了,服务重启后只需要重做最后一个日志文件。
cdo 2014-06-28
  • 打赏
  • 举报
回复
引用 8 楼 zilaishuichina 的回复:
[quote=引用 7 楼 cdo 的回复:] 没办法,能给我用的空间就只有10M。 字符串存在大量重复的情况,我准备过滤掉重复的,每个字符串只存一份,其它地方要使用的,直接拿到对应的指针,否则的话怕不够内存存放。 to zilaishuichina:”lz所说的10M可用 是指 专门用来建索引的空间 还是 用来存字符串的?“ 是用来建索引的空间 + 用来存字符串 的空间,只有10M(是共享内存,因为我们的系统共享内存是固定分好的,不是底层操作系统原始的)
字符长度在1-250间: 按照平均长度100来估算一下,10个字符串1K,10M最多存储10W个字符串。 按照最大长度250来估算一下,4个字符串1K,10M最多存储4W个字符串。 一个最基本的2分查找树,假设就是AVL的树吧,一个叶子结点需要:pFather,pLeft,pRight,pKey,pValue。一个叶子结点需要存储5个指针。 如果lz生成的是32位程序,5个指针需要20字节,如果是64位程序,5个指针需要40字节 其中pKey,pValue,在本需求中,可以优化和并为一个指针记录,32位节省4字节,64位得就是节省8字节。 也就是以32位程序为例的话, 一个字符串需要多开辟16个字节存储其对应的索引 所以,如果lz的字符串(不计算重复的),在10W个以内。 10M内存用一个AVL树做索引可以解决。 [/quote] 感谢zilaishuichina的答复。我目前使用了hashtable的方式来解决,一个节点占8字节,再加上桶中元素每个4字节(这部分是需要一次申请所有预设个数的总大小),再加载上字符串本身,好像也差不多够了。我准备把两个算法比较一下,看哪个效率高。 struct HashNode_Struct { char* sKey; HashNode* pNext; }; HashNode* hashTable[HASH_TABLE_MAX_SIZE];
赵4老师 2014-06-26
  • 打赏
  • 举报
回复
引用 8 楼 zilaishuichina 的回复:
[quote=引用 7 楼 cdo 的回复:] 没办法,能给我用的空间就只有10M。 字符串存在大量重复的情况,我准备过滤掉重复的,每个字符串只存一份,其它地方要使用的,直接拿到对应的指针,否则的话怕不够内存存放。 to zilaishuichina:”lz所说的10M可用 是指 专门用来建索引的空间 还是 用来存字符串的?“ 是用来建索引的空间 + 用来存字符串 的空间,只有10M(是共享内存,因为我们的系统共享内存是固定分好的,不是底层操作系统原始的)
字符长度在1-250间: 按照平均长度100来估算一下,10个字符串1K,10M最多存储10W个字符串。 按照最大长度250来估算一下,4个字符串1K,10M最多存储4W个字符串。 一个最基本的2分查找树,假设就是AVL的树吧,一个叶子结点需要:pFather,pLeft,pRight,pKey,pValue。一个叶子结点需要存储5个指针。 如果lz生成的是32位程序,5个指针需要20字节,如果是64位程序,5个指针需要40字节 其中pKey,pValue,在本需求中,可以优化和并为一个指针记录,32位节省4字节,64位得就是节省8字节。 也就是以32位程序为例的话, 一个字符串需要多开辟16个字节存储其对应的索引 所以,如果lz的字符串(不计算重复的),在10W个以内。 10M内存用一个AVL树做索引可以解决。 [/quote] 真心膜拜楼上!
zilaishuichina 2014-06-26
  • 打赏
  • 举报
回复
引用 7 楼 cdo 的回复:
没办法,能给我用的空间就只有10M。 字符串存在大量重复的情况,我准备过滤掉重复的,每个字符串只存一份,其它地方要使用的,直接拿到对应的指针,否则的话怕不够内存存放。 to zilaishuichina:”lz所说的10M可用 是指 专门用来建索引的空间 还是 用来存字符串的?“ 是用来建索引的空间 + 用来存字符串 的空间,只有10M(是共享内存,因为我们的系统共享内存是固定分好的,不是底层操作系统原始的)
字符长度在1-250间: 按照平均长度100来估算一下,10个字符串1K,10M最多存储10W个字符串。 按照最大长度250来估算一下,4个字符串1K,10M最多存储4W个字符串。 一个最基本的2分查找树,假设就是AVL的树吧,一个叶子结点需要:pFather,pLeft,pRight,pKey,pValue。一个叶子结点需要存储5个指针。 如果lz生成的是32位程序,5个指针需要20字节,如果是64位程序,5个指针需要40字节 其中pKey,pValue,在本需求中,可以优化和并为一个指针记录,32位节省4字节,64位得就是节省8字节。 也就是以32位程序为例的话, 一个字符串需要多开辟16个字节存储其对应的索引 所以,如果lz的字符串(不计算重复的),在10W个以内。 10M内存用一个AVL树做索引可以解决。
mLee79 2014-06-25
  • 打赏
  • 举报
回复
10M是比较奇怪的要求, 只能拿来放 B+的前几级索引了..
cdo 2014-06-25
  • 打赏
  • 举报
回复
没办法,能给我用的空间就只有10M。 字符串存在大量重复的情况,我准备过滤掉重复的,每个字符串只存一份,其它地方要使用的,直接拿到对应的指针,否则的话怕不够内存存放。 to zilaishuichina:”lz所说的10M可用 是指 专门用来建索引的空间 还是 用来存字符串的?“ 是用来建索引的空间 + 用来存字符串 的空间,只有10M(是共享内存,因为我们的系统共享内存是固定分好的,不是底层操作系统原始的)
taodm 2014-06-24
  • 打赏
  • 举报
回复
1 很多是多少 2 为啥是10M。现在手机都2G内存了,10M能干个毛啊。 3效率要多快?还是跨进程访问。 其实,用是数据库是比较靠谱的事儿。
zilaishuichina 2014-06-24
  • 打赏
  • 举报
回复
lz所说的10M可用 是指 专门用来建索引的空间 还是 用来存字符串的?
一叶之舟 2014-06-24
  • 打赏
  • 举报
回复
如果数据量大,就用多台机器建DHT。
一叶之舟 2014-06-24
  • 打赏
  • 举报
回复
如果数据量不大,用DHT(分布式哈希表)建一个服务,提供给所有进程访问,查询插入速度不到1毫秒,并发上千次访问。
赵4老师 2014-06-24
  • 打赏
  • 举报
回复
放在RamDisk上的一个文件中。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧