2016-09-03 9 views
0

私は時間ベースのスライディングウィンドウ(Pythonで)を実装しようとしています。つまり、データソースは新しいデータアイテムを挿入し、 、1hは自動的に削除されます。さらに、データソースがアイテムを挿入するレート、つまりレートの変化を測定する必要があります。時間ベースのスライディングウィンドウとデータ到着率の測定(変更)

私の質問は2倍です。まず、どのように時間ベースのウィンドウを実装するための最良の方法です。私の現在、おそらく素朴な解決策では、私は単純にPythonリストwindow = []を使用します。新しいデータitemの場合は、現在のタイムスタンプ:window.append((current_time, item))で項目を追加します。これは動作しますが、これにより巧妙な解決策があるかどうか、私は疑問に思う、

threshold = int(time.time()*1000) - self.WINDOW_SIZE_IN_MS 
while True: 
    try: 
     if window[0][0] < threshold: 
      del self.word_lists[0] 
     else: 
      break    
    except: 
     break 

:次に、タ​​イマー、I popごとに1秒(タイムスタンプ-1H)、現在よりも古いタイムスタンプを持つすべての最初の要素を使用して。

さらに重要なことは、レートデータ項目の変化を測定する良い方法は、ウィンドウに入ることです。ここでは、どのようにこれにアプローチするか、少なくとも効率的に聞こえるものはありません。私は非常に素朴な何かを思いついた:私は5分ごとに20間隔で1時間窓を分割し、項目の数を数えます。最新の5分間隔が20間隔の平均よりも大幅に多い場合、私はバーストがあると言います。しかし、私はこれを1分ごとにしなければならないでしょう。これは効率的ではないと思われ、多くのパラメータがあります。

要するに、新しいアイテムが私のウィンドウに入る加速度を測定する必要があります。このためのベストプラクティスのアプローチはありますか?

+0

毎分リストの 'len'を記録することができます。 1-diffを計算すると、毎分の変化率が得られます。 – James

答えて

0

最初の部分は、期限切れのアイテムをチェックし、追加する新しいアイテムを受け取ったときに削除する方が効率的です。つまり、実際に作業が行われているときにメンテナンス作業をちょうど1つの理由で何もしなくても起きさせるタイマーを気にしないでください。

2番目の部分では、1時間全体が既知の長さです。 5分前にインデックスにある整数を格納します。挿入を行うときにこれを維持することができ、それを前方に移動するだけでよいことがわかります。

すべて一緒にそれを置く、擬似コード:過去5分に到着したものを過去の時間からの項目の割合

window = [] 
recent_index = 0 
def insert(time, item): 
    while window and window[0][0] < time - timedelta(hours=1): 
     window.pop() 
     recent_index -= 1 

    while window[recent_index][0] < time - timedelta(minutes=5): 
     recent_index += 1 

    window.append((time, item)) 

    return float(len(window) - recent_index)/len(window) 

上記の機能に戻ります。 20〜50%を超えると、バーストが発生します。

+0

タイマーを使用しないと、項目がウィンドウ内で1時間長く長くなることがあります。つまり、データソースがデータの挿入をしばらく停止すると、ウィンドウ内の現在のアイテムは決して削除されません。 1秒タイマーでは、少なくとも最悪の場合の保証があります。 – Christian

+0

@Christian:窓で何が起こっているのかは言いませんでした。それ以外のアクションがある場合は、期限切れのアイテムを最初にチェックすることができます。結局、非常に安いチェックです。 –

関連する問題