优化内存中DataTable搜索速度,IP区域汇总
前段时间遇到一个IP的问题,IP库有大约50w的数据,每天登陆网页的人数大约有5000,想做出一个柱状图,显示这5000人的城市分布情况,肯定不能将这5000人去读取5000次数据库,那么只能将这个IP库50w的数据放在程序的内存中,但是不做优化,直接去50w数据中筛选,无疑消耗是可怕的,经过几日测试,现将一个比较好的解决方案提供:
①:查询时候排序,然后根据二分法去读取内存中的(非数据库的)数据集
②:将数据集放在一个哈希表中,加速单个的查询速度
③:有人说可以再sql中写自定义函数处理,这个本人没尝试过,其他人有好的方案也可以提供
读取出来放大哈希表的代码就不贴了,仅贴上二分法的吧,仅供参考:
①:二分法处理这个数据集
static int Dichotomy(Dictionary<int, Int64[]> arr, Int64 v) { int low = 0; int high = arr.Count - 1; int mid; while (low <= high) { if (low == high) { return low; } mid = (low + high) / 2; if (v < arr[mid][0])//查询的值小于中值,查询区间就是low到新的上限 { high = mid - 1;//上限的索引值 } else if (v > arr[mid][0])//查询的值大于中值,查询区间就是新的下限到high { low = mid + 1;//下限的索引值 } else { return mid; } } return high; }
以上纯属个人观点,转载请注明出处
--------------AK:2012-10-24