6

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をターゲットにしています。

4

6 に答える 6

6

のキーはDictionary単純なタイプである必要はありません。あなたの場合、最も簡単な解決策はTuple<int, int, DateTime>キーとして使用することです。Equals()別の方法は、とGetHashCode()(そして理想的には)を正しく実装するカスタムタイプを作成することIEquatableです。

データベース側でも同じことができます。ほとんどのデータベースは複合キーをサポートしています。

于 2013-01-21T01:52:51.023 に答える
1

Guidキーを作成して使用することができます。

byte[] bytes = new byte[16];

BitConverter.GetBytes(i1).CopyTo(bytes, 0);
BitConverter.GetBytes(i2).CopyTo(bytes, 4);
BitConverter.GetBytes(dt.Ticks).CopyTo(bytes, 8);

Guid key = new Guid(bytes);

Dictionary<Guid, int>上記をvsとループで実行するDictionary<Tuple<int, int, DateTime>, int>と、Guidキーの方が速いように見えますが、シナリオでテストする必要があります。

明確にするために、私はDictionary<Guid, int>テストにを使用しましたが、あなたの場合はDictionary<Guid, YourHistoryType>Guidコード内で他のすべてが行われている状態で、との使用の違いTuple<int, int, DateTime>が無視できる程度であり、より適切と思われる方を使用できたとしても、私は驚かないでしょう。

于 2013-01-21T03:15:26.523 に答える
0

What you think about putting all data into array or some other object and serializing it?

Additionally you can use MD5 alghoritm to pack all of this into string with fixed length.

于 2013-01-21T02:16:38.957 に答える
0

私はsvickの答えを好みますが、ネストされたDictionary? Dictionary<int, Dictionary<int, Dictionary<DateTime, object>>>. 可能?アイテムのコレクションの高速検索が可能になる場合があります。

于 2013-01-21T02:43:54.063 に答える
-2

このようなものはどうですか:

int i1 = 123123;
int i2 = 23433;
DateTime dt = DateTime.Now;
string s;
s = i1.ToString("X") + i2.ToString("X") + dt.Ticks.ToString();
于 2013-01-21T01:54:39.327 に答える
-2

私が開いている唯一の方法は、これを行うことです。

DateTime dt = GetYourDateTime();
string uniqueID = dt.Year + "" + dt.Month + "" + dt.Day + "" + dt.Hour + "" + dt.Minute + "" + dt.Second + "" + dt.Millisecond + "";

その後、それを任意の数値型、つまり decimal、long などに変換できます。

更新しました

int a = 2000;
int b = 3000;
DateTime dt = GetYourDateTime();
    string uniqueID = a + "-" + b+ "-" +dt.Year + "" + dt.Month + "" + dt.Day + "" + dt.Hour + "" + dt.Minute + "" + dt.Second + "" + dt.Millisecond + "";

2013 年 1 月 11 日: 2000-3000-2013011100000000

2013 年 11 月 1 日: 2000-3000-2013110100000000

于 2013-01-21T01:58:57.053 に答える