1秒あたり約30〜50のメッセージ(300〜500行のデータ)を送信するオンラインフィード(tcpリレー)を解析しています。メッセージには、注文と履歴の2種類の情報が含まれています。
したがって、注文の場合、それぞれに一意のIDがあり、次のようになります。
private static Dictionary<long,MarketOrder> MarketOrders = new Dictionary<long,MarketOrder>();
注文が入ってくると、そこに注文を挿入します。データはキャッシュファイルから取得されるため、メッセージには古いデータを含めることができ、フィルターで除外する必要があります。私は現在これを行っています:
if (MarketOrders.ContainsKey(order.OrderID))
{
// If record exists in a dictionary add hits and overwrite the object if newer.
int hits = MarketOrders[order.OrderID].Hits;
if (MarketOrders[order.OrderID].LastUpdated < order.LastUpdated)
{
MarketOrders[order.OrderID] = order;
}
MarketOrders[order.OrderID].Hits = hits + 1;
}
else
{
// If not, add new one
order.Hits = 1;
MarketOrders.Add(order.OrderID, order);
}
これはBackgroundWorkerプロセスで実行され、ディクショナリアイテム数が2500に達すると、(バイナリシリアライザーを使用して)ディープクローンが作成され、クリアされて別のバックグラウンドプロセスが開始され、クローンされたコピーがデータベースに挿入されます。辞書がクリアされるとすぐに、注文が再度挿入されます。つまり、基本的には、できるだけ多くの情報を受け取り、データベースにバッチで挿入しようとしています。
履歴データと同じようなことをしようとしています。一意のID自体はなく、一意性は値の組み合わせに由来し<int, int, DateTime>
ます。
これらの3つの値から一意のキーを生成する高速な方法が必要なので、注文の場合と同じように辞書に保存するか、そのデータを保存およびフィルタリングする別の方法が必要です。
助言がありますか?.NET4.0をターゲットにしています。