/// <summary> /// topk 目前的names.count = 1 主要在服务器端未实现多值比较 /// </summary> public List <List <long> > topK(int k, string[] names) { if (k == 0) { throw new Exception("k不能为0"); } List <int> pos = new List <int>(); foreach (var name in names) { pos.Add(nametopos(name)); } TopKMessageWriter msg = new TopKMessageWriter(k, pos, this.cellIds); List <List <long> > r = Global.CloudStorage.TopKFromClientToDatabaseProxy(0, msg).celllids; return(r); }
public override void TopKFromClientHandler(TopKMessageReader request, TopKResponceWriter response) { idDict.Clear(); values.Clear(); List <List <List <long> > > classify = Classify(request.celllids, request.cond); for (int i = 0; i < Global.ServerCount; i++) { TopKMessageWriter msg = new TopKMessageWriter(request.k, request.cond, classify[i]); Global.CloudStorage.TopKFromProxyToDatabaseServer(i, msg); } sem.WaitOne(); int k = request.k; int[] stage = new int[k]; for (int i = 0; i < k; i++) { stage[i] = 0; } response.celllids = new List <List <long> >(); for (int i = 0; i < k; i++) { int max = values[0][stage[0]]; int maxserver = 0; for (int j = 1; j < Global.ServerCount; j++) { if (max < values[j][stage[j]]) { max = values[j][stage[j]]; maxserver = j; } } response.celllids.Add(idDict[maxserver][stage[maxserver]]); stage[maxserver]++; } }