如何建立一个可共享和快速查找、插入的字符串资源池
怎么建立一个可共享和快速查找、插入的字符串资源池?
项目上有一个优化需求,大概的情况如下:
1.有很多字符串(字符长度在1-250间)
2.可使用的内存很小,只有大概10M左右的空间了
3.字符串资源要多个进程访问
4.能增加新的字符串,其它进程也要能访问新增量的字符串
5.查询,插入的效率要快(暂无删除和修改已存在字符串的需求)
我想把所有字符串都分配到共享内存上,如果要新增的字符串已存在,直接获取对应的指针地址,而不再重新插入。
但不知道什么样的算法,才能让字符串访问、增加效率最高,请各位大虾指点,百分感谢!
------解决方案--------------------
放在RamDisk上的一个文件中。
------解决方案--------------------
如果数据量不大,用DHT(分布式哈希表)建一个服务,提供给所有进程访问,查询插入速度不到1毫秒,并发上千次访问。
------解决方案--------------------
lz所说的10M可用 是指 专门用来建索引的空间 还是 用来存字符串的?
------解决方案--------------------
1 很多是多少
2 为啥是10M。现在手机都2G内存了,10M能干个毛啊。
3效率要多快?还是跨进程访问。
其实,用是数据库是比较靠谱的事儿。
------解决方案--------------------
10M是比较奇怪的要求, 只能拿来放 B+的前几级索引了..
------解决方案--------------------
字符长度在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树做索引可以解决。
------解决方案--------------------
真心膜拜楼上!
------解决方案--------------------
楼上说的都是偏理论的哈,我给楼主个工程一点的建议:
1,做一个服务,底层leveldb,,对外提供网络接口访问。
2,为了满足按增量访问,创建2个leveldb,一个是major leveldb,一个是minor leveldb,数据写入后先进入minor,客户端访问minor获取数据后后插入major。
2个leveldb的问题也很明显,就是从minor删除到major插入不是事务的,如果要保证事务安全,自己做一个redo-log,按序号递增滚动当作checkpoint就可以了,服务重启后只需要重做最后一个日志文件。
项目上有一个优化需求,大概的情况如下:
1.有很多字符串(字符长度在1-250间)
2.可使用的内存很小,只有大概10M左右的空间了
3.字符串资源要多个进程访问
4.能增加新的字符串,其它进程也要能访问新增量的字符串
5.查询,插入的效率要快(暂无删除和修改已存在字符串的需求)
我想把所有字符串都分配到共享内存上,如果要新增的字符串已存在,直接获取对应的指针地址,而不再重新插入。
但不知道什么样的算法,才能让字符串访问、增加效率最高,请各位大虾指点,百分感谢!
------解决方案--------------------
放在RamDisk上的一个文件中。
------解决方案--------------------
如果数据量不大,用DHT(分布式哈希表)建一个服务,提供给所有进程访问,查询插入速度不到1毫秒,并发上千次访问。
------解决方案--------------------
lz所说的10M可用 是指 专门用来建索引的空间 还是 用来存字符串的?
------解决方案--------------------
1 很多是多少
2 为啥是10M。现在手机都2G内存了,10M能干个毛啊。
3效率要多快?还是跨进程访问。
其实,用是数据库是比较靠谱的事儿。
------解决方案--------------------
10M是比较奇怪的要求, 只能拿来放 B+的前几级索引了..
------解决方案--------------------
字符长度在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树做索引可以解决。
------解决方案--------------------
真心膜拜楼上!
------解决方案--------------------
楼上说的都是偏理论的哈,我给楼主个工程一点的建议:
1,做一个服务,底层leveldb,,对外提供网络接口访问。
2,为了满足按增量访问,创建2个leveldb,一个是major leveldb,一个是minor leveldb,数据写入后先进入minor,客户端访问minor获取数据后后插入major。
2个leveldb的问题也很明显,就是从minor删除到major插入不是事务的,如果要保证事务安全,自己做一个redo-log,按序号递增滚动当作checkpoint就可以了,服务重启后只需要重做最后一个日志文件。