3

ログ ファイルを読んでいますが、すべての行をすぐに処理したいわけではありません。キュー/バッファを使用して、処理されるのを待っている間に行を保存しています。

このキューは定期的に特定の行をスキャンされます - それらが見つかると、それらはキューから削除されます (行はどこにでもあります)。特定の行が見つからない場合、行はキューの先頭から 1 行ずつ取り出されて処理されます。

したがって、キューには次のものが必要です。

  • サイズ変更可能(またはその印象を与える)
  • どこからでも要素を削除する
  • 要素が追加されている (常にキューの最後にある)
  • すばやくスキャン
  • パフォーマンスに応じて、最後のスキャンで到達した場所のポインタを用意してください。

Java や API の経験がほとんどないときに最初にコードを書き、ArrayList が機能することを知っていたので (必ずしもそれが最適なオプションだったというわけではありません)、単に ArrayList を使用しました。

処理する必要のあるログがますます多くなり、パフォーマンスが低下しています。この状況で使用するためにどのコレクションをお勧めしますか? 自分で書く可能性も常にあります。

ありがとう

4

8 に答える 8

6

LinkedHashSetが興味深いかもしれません。これは事実上HashSetですが、予測可能な反復順序を可能にするLinkedListも維持します。したがって、FIFOキューとしても使用でき、重複するエントリを含めることができないという優れた利点があります。

これもHashSetであるため、(スキャンではなく)検索が一致する場合はO(1)にすることができます。equals()

于 2008-11-13T15:06:08.263 に答える
4

おそらく LinkedList が最も適切でしょう。要求されたすべてのプロパティがあり、ArrayList に必要な直線的な時間ではなく、一定の時間でリンクを途中から削除できます。

次に削除する要素を見つけるための特定の戦略がある場合は、PriorityQueue または並べ替えられたセットがより適切な場合があります。

于 2008-11-13T09:41:55.570 に答える
2

すばやくスキャンすると、通常、ある種のハッシュベースの実装を意味します。ConcurrentSkipListMapが適切な実装である可能性があります。containskey、remove、getメソッドのLog(n)は、ある種の優先順位を関連付けることができるようにソートされています。

于 2008-11-13T10:18:37.523 に答える
1

読み取られている行を並べ替えたくありません (元の順序を維持する必要があります)。ただし、ログに記録された各行が持つセッション ID (セッションごとにログに記録された複数の行) に基づいて、行をブロックする可能性があります。

考えてみると、次の可能性があります。

HashMap<String,LinkedList<String>>

セッション ID をキーとして指定し、LinkedList にセッションに属する行を入力します。

マップは、セッション X に関係する行をすばやく検索する方法を提供し、リンクされたリストは、行を追加/削除するための最高のパフォーマンスを提供します (検索のパフォーマンスは、セッション x に関係する行を見つけることでした。したがって、実際の行セッション x を処理するには、最初から最後まで読み取って削除できます (プッシュ/ポップ)。

サイズが変更され、行が最後に追加され、常に最初から取得される、リンクされたリストよりも優れたコレクションはありますか? とにかく、Queue コレクションはリンクされたリストを拡張すると思いますか?

于 2008-11-13T13:12:55.340 に答える
0

セットから要素を削除および追加し、特定の値を検索する必要があるため、TreeSetなどのSortedSetを実装するものがより適切な構造になる可能性があります。このクラスは、追加、削除、および含むのlog(n)パフォーマンスを保証します。

于 2008-11-13T10:22:42.723 に答える
0

私はAVIに同意し、リンクリストが最善の選択肢です。簡単にサイズを変更したり、リストの最後にすばやく追加したり、どこからでもすばやく削除したりできます。検索は高速ではありませんが、他のソートされていないリストよりも悪くはありません。

于 2008-11-13T15:10:57.240 に答える
0

グアバが役立つかもしれません。

Guava プロジェクトには、コレクション、キャッシング、プリミティブのサポート、同時実行ライブラリ、共通の注釈、文字列処理、I/O など、Java ベースのプロジェクトで依存している Google のコア ライブラリがいくつか含まれています。

于 2008-11-21T15:29:46.653 に答える
0

いくつかのスレッドがキューに書き込み、別のスレッドがキューから読み取ると思います。

この場合、java.lang.concurrent パッケージのキューを確認する必要があります。

PriorityBlockingQueue を使用して要素を並べ替えるか、LinkedBlockingQueue を反復処理して削除する要素を自分で選択する場合に使用できます。

于 2008-11-13T10:44:28.953 に答える