2

毎日約1e10行のログ ファイルがあり、それぞれに ID 番号 (15 桁未満の整数)、ログイン時刻、ログアウト時刻が含まれているとします。IDによっては、ログインとログアウトを数回繰り返す場合があります。

質問 1 :

ログインしたIDの総数を数える方法は?(各IDを2回以上数えるべきではありません)

ここでハッシュテーブルを使用しようとしましたが、取得する必要があるメモリが非常に大きい可能性があることがわかりました。


質問 2 :

オンライン ユーザーの人口が最大になる時間を計算します。

1 日の時間を 86400 秒に分割し、ログ ファイルの各行について、オンライン間隔の各秒に 1 を追加すると思います。または、ログイン時刻でログ ファイルを並べ替えることができますか?

4

5 に答える 5

1

質問 2 を理解するには、おそらく 2 つのことをログに記録する必要があります: ユーザーのログインとユーザーのログアウトです。ユーザー ID とともに 2 つの異なるアクティビティ。このリストがアクティビティ (ログインまたはログアウトのいずれか) が行われた時刻でソートされている場合。currentusers というカウンターでスキャンするだけです。ログインごとに 1 を追加し、ログアウトごとに -1 を追加します。その数 (現在のユーザー) が到達する最大値は、関心のある値です。おそらく、それがいつ発生したかを追跡することにも関心があるでしょう..

于 2013-04-14T07:00:57.193 に答える
0
  1. セグメント ツリーを使用して、連続する ID の間隔を格納します。すべてのログイン イベントのログをスキャンします。ID を挿入するには、まず ID を含むセグメントを検索します。存在する場合、ID は重複しています。id の直後または直前のセグメントを検索しない場合。それらが存在する場合は、それらを削除し、必要に応じて新しい ID をマージして、新しいセグメントを挿入します。存在しない場合は、id を 1 要素のセグメントとして挿入します。

    すべての ID が挿入されたら、ツリー内のすべてのセグメントの基数を合計してその数を数えます。

  2. 仮定して:

    • 特定の ID は、一度に 1 回だけログインできます。
    • イベントは時系列で保存されます (これが通常のログです)

    ログをスキャンし、c現在ログインしているユーザー数、検出された最大数m 、および関連付けられた時間のカウンターを保持しますt。ログインするたびに を増やしc、ログアウトするたびに減らします。各ステップで更新mtmが より小さい場合c

于 2013-04-14T08:30:19.500 に答える