号码过滤,超大访问量情况下如何处理? 情况是有一个号码池(存放号码的集合估计10万个左右),用户提交号码时判断该号码是否在池里,在就过滤,我是把过滤池的号码村在了hashtable,然后判断用户提交的号码是否在hashtable里面,这样处理小数据还可以,但用户访问过率时系统会很慢, 求更快的方法,希望能给出具体代码,用完成端口或线程..... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 hashtable用泛型,甚至用数据库还好过。 如果只是 判断号码 是否存在 不必要用hashtable数组即可如果是要根据 userID 来取号码 才使用hashtable不管那种楼主可以 将 号码 按段分解 使用多个hashtable(第一种情况用数组即可)比如 130 133 135 139 在你的号码中是存在的 先去查这个段记录是否存在,再往下找后面的段 , 具体分组看情况 GXY2005(☆☆☆☆☆樱之花要嫁偶) :号码没什么规律,前期是这么想的,不过具体实现没能实现,是不是要用到完成端口啊 Nick_Nick(统统..都给..我..密码) :你说的二分法查找如何实现啊,能说的再具体一下吗 不管那种楼主可以 将 号码 按段分解 使用多个hashtable(第一种情况用数组即可)比如 130 133 135 139 在你的号码中是存在的 先去查这个段记录是否存在,再往下找后面的段 , 具体分组看情况还是,hertcloud(·£孙子兵法£·) 的办法试试 谢谢大家 我先按,hertcloud(·£孙子兵法£·) 的意见试下,希望大家继续提供实验方法,多提意见 慢的原因一般来说是内存占用太大了,你可以考虑用Xml来存储这些号码,然后用占内存很小的XmlReader来分析这个Xml,这样可能会效率会提高很多.(以前有过这种类似做法). 个人意见:找一下号码的规律然后创建索引:如果你的号码不是类似GUID的毫无规律的东西,就一定有规律,比如身份证号码可以按照地区,手机号可以按号段等等,按照这个创建索引。放弃HashTable用数组:HashTable存对象,每一次都要装箱、拆箱,这个操作比较耗时,再者HashTable是Key-Value成对的,对于存储号码也没有意义。我估计你用HashTable是因为它有类似HasValue的属性。如果需要Key-Value模式的,可以考虑专为字符串设计的StringDictionary。不过你这个,我觉得数组更好些。 10W这个数量级上绝对是Hashtable最快。如果lz想要优化,把号码转成long型。 但是数组肯定会比Hashtable快N多 StringDictionary是没有范型时候的产物,基本相当于Dictionary<string,string>。Dictionary是实现了范型的Hashtable。 但是数组肯定会比Hashtable快N多---------------------为什么? 大家的数据结构都是怎么学的hashtable 是最快的,前面已经有几位提到了。 估计是getcode()写得不好,碰撞得太厉害 我用了hertcloud(·£孙子兵法£·)说的办法 快了50被 在问下 我用 hertcloud(·£孙子兵法£·) 怎么写成通用的啊就是号段可能有变化 但程序不需要改变 想知道lz一开始怎么用hashtable的? hashtable ht = new hashtable();ht.add(key,value); hashtable ht = new hashtable();ht.add(key,value);key是什么?value是什么?你怎么判断号码在不在ht里? ht.ContainsValue(value)晕了,哪有这样用的。用ContainsKey() wince 开源控件库 Silvermoon显示中文问题,求助 ********工作比较轻松,上个实体类排序通用函数(冒泡) 腾讯微博邀请码,有需要的速度 如何测试一个软件的性能 线程难点 弱弱的问一下,如何知道MessageBox.Show以后用户点的什么然后执行操作? 如何实现类似WinRAR在系统右键菜单里添加菜单的功能? 求助!!!! 求救, enum 问题。 求C#开发的C/S转B/S帮助,或转换工具软件 C#调用SDK函数的问题. 从C++来的。庞大的NET类库,如何理清头绪?
用泛型,甚至用数据库还好过。
不管那种
楼主可以 将 号码 按段分解 使用多个hashtable(第一种情况用数组即可)
比如 130 133 135 139 在你的号码中是存在的 先去查这个段记录是否存在,
再往下找后面的段 , 具体分组看情况
你说的二分法查找如何实现啊,能说的再具体一下吗
楼主可以 将 号码 按段分解 使用多个hashtable(第一种情况用数组即可)
比如 130 133 135 139 在你的号码中是存在的 先去查这个段记录是否存在,
再往下找后面的段 , 具体分组看情况
还是,hertcloud(·£孙子兵法£·) 的办法试试
希望大家继续提供实验方法,多提意见
找一下号码的规律然后创建索引:如果你的号码不是类似GUID的毫无规律的东西,就一定有规律,比如身份证号码可以按照地区,手机号可以按号段等等,按照这个创建索引。
放弃HashTable用数组:HashTable存对象,每一次都要装箱、拆箱,这个操作比较耗时,再者HashTable是Key-Value成对的,对于存储号码也没有意义。我估计你用HashTable是因为它有类似HasValue的属性。如果需要Key-Value模式的,可以考虑专为字符串设计的StringDictionary。不过你这个,我觉得数组更好些。
Dictionary是实现了范型的Hashtable。
就是号段可能有变化 但程序不需要改变
ht.add(key,value);
ht.add(key,value);key是什么?value是什么?
你怎么判断号码在不在ht里?