明论  
公告
日历
统计
  • 随笔 - 12
  • 文章 - 32
  • 评论 - 79
  • 引用 - 0

导航

 

最新评论

共4页: 1 2 3 4 下一页 
实际上,什么时候会用Parent? 只有遍历,插入,删除的时候才会用到Parent。 另外,你的RBTree的规模会有多大?据我所知,目前RBTree的规模很难超过128层,对于128层的RBTree,至少有2^64个节点,这个数据规模是很大的。因此,我建议在插入、删除的时候可以暂时将parent节点放在一个临时数组中就可以了。 如果需要具体实现的话,等我把公司里的数据结构剔除后可以share出来。哈哈。
@coffeestone 确实在查找中parent是多余的,但是临时保存的parent增加的大量的程序复杂度,所以权衡一下还是要加上。
parent节点是可以从结构中拿掉的,这样可以节省很多内存,尤其在64-bit机器上体现的更明显。parent可以通过栈数据结构重新获得。 毕竟,search也好,插入、删除也好,都要从根节点找到你的操作节点,利用这个过程,可以把所有的父节点恢复出来。
@sunriseyuen 内存放的不是数据,是索引,一般的服务器10几G内存很常见,1000W 8位INT的索引值如文章所说,只有200多M,加上使用内存池,都是无碎片的密集排列,占用资源极小。
个人感觉用sqlite已经足够,如果超出1000W数据很卡是一个事实,那么将1000W的数据放入内存似乎也不是一个好的处理方式。
@sunriseyuen sqlite适合小型应用,用它处理大数据量,超过1000W很多机器都会卡死,
好东西~最近在做实时数据库~ 顶啊
@eaglet 多谢指教 内存申请和释放的单元并不是MemoryBlock,而是代码里的Uint,MemoryBlock已经是大块连续的内存区域,这些Block体积可以设置的比较大,只要在寻址范围内都可以,所以一个池里只会有为数不多的MemoryBlock,如初始化所示,一个MemoryBlock默认可以1024放置这么多的内存单元,当然根据CPU的取指能力还可以大大的增加,MemoryBlock是申请和释放不是一个频繁发生的概率,而Uint的申请释放为O(1)
你的代码中那个 while 循环遍历链表的方法效率不是很高,分配和释放内存应在 O(1) 的时间复杂度内完成。采用空闲队列来分配和释放内存可以不用遍历链表,O(1)的时间复杂度,效率比你这个要高很多。另外你内存块全部是new 出来的,如果块比较小,这种 new 将在堆中留下大量的碎片,建议用大块连续内存来存放小的内存块,自己来管理这些内存块,而不是交给堆去处理。
@egmkang tcmalloc链表结构比较繁复,不利于内存监控,所以自己实现了,用于程序框架底层。
为什么不考虑使用现成的内存池,而是自己写一个呢? tcmalloc你可以尝试一下
Re:内存池完整实现代码及一些思考 博客园团队 2011-06-06 16:51  
建议优化一下排版,给代码加上着色。
共4页: 1 2 3 4 下一页 
 
Copyright © konyel Powered by: 博客园 模板提供:沪江博客