朱博的技术园

关注基于.Net的Web解决方案,高性能数据库设计,高性能Web服务解决方案

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  9 随笔 :: 0 文章 :: 144 评论 :: 2 引用

对于数据量大(索引文件大于50M)的索引,尽量不要用索引中的字段排序,要用索引ID排序(INDEXORDER);两者效率相差近10倍,以下从内存占用与CPU处理时间来比较:

内存占用比较:
图一:使用整型的唯一标识字段排序


图二:使用索引ID(INDEXORDER)排序


拿占用内存最多的对象来比较:我们可以看到,图一比图二多 2,900,766 bytes(索引文件大小:61M)

处理时间比较:
使用整型的唯一标识字段排序的处理时间是3016ms,使用索引ID(INDEXORDER)排序的时间是303ms

解决方法:
为了能够使索引ID倒序等同于时间倒序:在建立索引时,就要按照数据的时间顺序建立,老的数据先索引,新的数据后索引
倒序代码:

//以下代码基于Incubating-Apache-Lucene.Net-2.0-004-11Mar07
Hits hits = searcher.Search(query, new Sort(new SortField(null, SortField.DOC, true)));

参考:http://markmail.org/message/noq4kohwipx5wzfo#query:Sort.INDEXORDER+page:1+mid:4ydkfgdj6kbvhq2x+state:results

posted on 2008-02-25 18:01 朱博 阅读(2728) 评论(18)  编辑 收藏 网摘

评论

#1楼  2008-02-25 18:39 红尘 [未注册用户]
支持一下,内存占用比较用的是什么软件??
  回复  引用    

#2楼 [楼主] 2008-02-25 18:41 朱博      
@红尘
JetBrains dotTrace 2.0
  回复  引用  查看    

#3楼  2008-02-25 18:46 cw [未注册用户]
支持一下....
  回复  引用    

#4楼  2008-02-25 18:57 wingoo      
多个排序字段怎么办?

对dotTrace 比较感兴趣^_^

  回复  引用  查看    

#5楼 [楼主] 2008-02-25 18:59 朱博      
@wingoo
我这里没有考虑多个字段的排序,多个字段的排序还需要继续研究,如有好的办法,感谢分享
  回复  引用  查看    

#6楼  2008-02-25 21:41 puserchen [未注册用户]
确实是一个不错的方法
  回复  引用    

#7楼  2008-02-25 22:44 没剑      
你的解决方法是:在建立索引时,就要按照数据的时间顺序建立,老的数据先索引,新的数据后索引
----
你如何解决新旧索引叠加的问题?如有一索引1为昨天数据,现在加上一个新的索引....
你可能也会想到是全新的再生成一次索引,但是如果数据越来越来,你这样的做法就会造成每次生成索引的时间越来越长...
我暂时使用的解决方法是使用索引合并,但这个合并也不是一个很完美的解决,因为它是要将旧的数据全并到新的数据里,然后再删除旧的索引,然后移动新生成的索引到旧的索引位置...因为如果不是把旧的索引合并到新的索引里的话你这个时间顺序建立的机制就会丢失
  回复  引用  查看    

#8楼  2008-02-25 22:48 Jeffrey Zhao      
IndexOrder自然最快因为相当于没有排序阿。
但是有的时候是必须排序的(一会儿按字段A排序,一会儿按字段B排序),不是吗?
  回复  引用  查看    

#9楼 [楼主] 2008-02-26 09:09 朱博      
@没剑
对于文章类的数据来说,比如cnblogs的文章,一般情况下,先索引的是旧文章,后索引的是新文章,可以使用我的这种替代解决方案。

如果对于更为复杂一点的数据,这可能并不是好的办法。

更好的解决方案我还在研究中。
  回复  引用  查看    

#10楼 [楼主] 2008-02-26 09:11 朱博      
@Jeffrey Zhao
我的这种方法适用的仅仅是替代按照时间倒序排列,其他类型的排序,暂时还没有更好的解决方法。
dangdang.com的图书搜索用的应该是Lucene,他们是怎么实现按照销量、上架时间等排序的,如果有dangdang的技术,可否给大家分享一下。
  回复  引用  查看    

#11楼  2008-02-26 09:56 没剑      
朱博:
呵呵,因为我的哪种做法是为了在搜索中缩小返回的结果,因为lucene的搜索方式是从文档索引号的小到大的,先索引的号就小,后索引的号就大,所以我才要采用我说的哪种方法来,这样子的做法是麻烦,但是搜索的速度就大大提高了
  回复  引用  查看    

楼主用的内存比较是哪个软件!
  回复  引用    

#13楼 [楼主] 2008-02-26 18:08 朱博      
@红尘
@国外软件

JetBrains dotTrace 2.0
  回复  引用  查看    

#14楼  2008-04-22 08:57 shenjk      
看了博主的文章,有些收获。我最近也在搞这个东东,写了篇文章:希望对大家有用:http://blog.csdn.net/akunshenjk/archive/2008/04/22/2313543.aspx
  回复  引用  查看    

#15楼 [楼主] 2008-04-22 09:54 朱博      
@shenjk
很高兴能对你有所帮助。

我看了你的文章,方法很巧妙,但索引量比较大时会遇到严重的性能问题。不知shenjk是已经解决了还是还没有遇到。

若有解决性能的方法,还请不吝赐教。
  回复  引用  查看    

#16楼  2008-05-30 16:00 shenjk      
楼主:很长时间没来了,所以才看到你给我的回复,感谢回复。目前我的索引文件大小在350M左右,约60w条数据,搜索结果排序基本是按时间来排,这里说了“基本”,因为网站考虑到一些特殊的数据,需要保持在前面。所以,我是将时间转换,特殊数据加上一个基数。整体性能上确实不能让我十分满意,但是这毕竟不只是排序的问题,我这么认为的。因为我们的索引不可能是ID与时间完全对应的,在初次建立索引的时候,我们可以做到,一旦索引中有数据修改了(先删在添),这个时候ID和时间就对应不起来了,排序会乱。
所以,排序规则还是看具体应用。已建立的索引数据不在更改或很少去更改,你的方法确实在性能方面很优;对于更新频率较大的,我觉得我的方法还是可以的。毕竟性能问题我们可以想办法去提升的,比如分词,索引建立规则等等。就我的索引来说,目前性能问题主要由于分词,和服务器本身的负载引起的;正着手解决。
  回复  引用  查看    

#17楼  2008-06-13 09:24 ff [未注册用户]
Lucene in action 书中说针对非int类型排序和int排序差10倍左右。主要性能应该还是在string.compare上吧。
  回复  引用    

#18楼  2008-06-24 16:41 3wdotec [未注册用户]
不错..
  回复  引用    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
Google站内搜索

相关文章:


相关搜索:
Lucene.Net 排序

相关链接: