3

過去X分間にいくつのアイテムを照会できるデータ構造が必要です。アイテムは単純な識別子またはより複雑なデータ構造である可能性があり、できればアイテムのタイムスタンプは、外部に保存されるのではなく、アイテム内にあることが望ましいです (ハッシュまたは同様のものとして、複数のアイテムが同じものを持つ問題を抱えたくないでしょう)タイムスタンプ)。

これまでのところ、LINQ を使用すると、特定の時間よりも長いタイムスタンプを持つアイテムを簡単にフィルター処理して、カウントを集計することができたようです。.NET 3.5 固有のものを自分の運用環境に取り込もうとするのはまだためらっていますが。同様のデータ構造に関する他の提案はありますか?

私が興味を持っているもう 1 つの部分は、古いデータのエージングアウトです。6 時間以内のアイテム数のみを要求する場合は、それよりも古いものをデータ構造から削除したいと思います。長時間実行されるプログラムになります。

4

3 に答える 3

3

これには単純な連結リストを使用できます。

基本的に最後に新しいものを追加し、古いものは最初から削除するという、安っぽいデータ構造です。

サンプルコード:

list.push_end(new_data)
while list.head.age >= age_limit:
    list.pop_head()

一度に 1 つよりも大きな部分を切り落とすことを保証するほどリストが忙しくなる場合は、dmoに同意し、ツリー構造またはより高いレベルでの剪定を可能にする同様のものを使用します。

于 2008-08-19T08:53:14.697 に答える
2

重要な考慮事項は、クエリと追加/削除の頻度になると思います。頻繁にクエリを実行する場合 (特に大規模なコレクションがある場合)、B ツリーが適している場合があります。

http://en.wikipedia.org/wiki/B-tree

いくつかのスレッドを通過させて、このツリーを定期的にクリーンアップするか、検索の一部にすることができます (これも、使用状況によって異なります)。基本的には、ツリー検索を実行して "x 分前" のスポットを見つけてから、新しい時刻のノード上の子の数を数えます。ノードの下にある子の数を最新の状態に保つと、この合計をすぐに計算できます。

于 2008-08-18T22:25:35.200 に答える
2

有効期限がスライドするキャッシュが仕事をします....

アイテムを詰め込むと、キャッシュがエージングを処理します....

http://www.sharedcache.com/cms/

于 2010-04-23T15:32:59.280 に答える