※ 引述《eplis (Eplis)》之铭言:
: 这个问题比较像是如何设计。
: 系统会陆续收到很多笔资料(一天约两千万笔),我想判断这些资料是否有重复。
: 通常只需要和当天资料比较,也就是说今天资料不需要和两天前的比。
: 原先我是使用 dictionary储存,收到资料就 add 进 dictionary,
: 再使用 containskey 方法来做为重复判断。
: 目前问题出在当系统运作几天后,这个dictionary内的资料量会变得很大
: 而不需要被比较的资料仍旧存在(如上面所说,要判断重复仅须和资料的+-1天相比)
: 我想到用 remove(dictionary.keys.first)方式,但是新进的资料就会被放在 first
: 一旦下一次 remove时就会删到较新的资料
设计两层的结构
dictionary<string, dictionary<key, value>> data = new ....
DateTime dateNow = DateTime.Now;
string sDate = dateNow.toString("yyyyMMdd");
data[sDate].add(newKey, newValue);
sDate = dateNow.addDay(-1).toString("yyyyMMdd");
if(data.containskey(sDate))
data.remove(sDate);
以日期作索引,换日时有资料变动就可以自动移除旧资料
map的结构,资料蒐寻很快(透过key),但add, remove的成本也高
所以减少资料不断需要add, remove的次数可以提高效能
另外如果会同时从不同来源收到多笔资料,记得写个queue做缓冲
题外话:
也可以考虑用现成的memcache,例如redis(NOSQL,且具备分布式内存服务器的功能)
可以设定资料保存期限