作者VVll (信)
看板C_Sharp
标题Re: [问题] dictionary 使用问题
时间Tue Apr 1 03:06:23 2014
※ 引述《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,且具备分散式记忆体伺服器的功能)
可以设定资料保存期限
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.240.239.100
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1396292788.A.9DA.html