Re: [問題] dictionary 使用問題

作者: VVll (李奧納多皮卡丘)   2014-04-01 03:06:23
※ 引述《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,且具備分散式記憶體伺服器的功能)
可以設定資料保存期限

Links booklink

Contact Us: admin [ a t ] ucptt.com