Frage

ich Logfiles lese aber nicht alle wollen Linien verarbeitet sofort werden. Ich verwende eine Warteschlange / Puffer, um die Zeilen zu speichern, während sie verarbeitet werden, warten.

Diese Warteschlange regelmäßig für bestimmte Linien gescannt - wenn sie gefunden werden, sie aus der Warteschlange entfernt werden (sie können in ihm überall sein). Wenn es nicht eine bestimmte Zeile zu finden sind, werden Zeilen aus dem Anfang der Warteschlange nacheinander aufgenommen, verarbeitet werden.

Daher ist die Warteschlange muss wie folgt vor:

  • Kann der Größe verändert werden (oder diesen Eindruck geben)
  • -Elemente haben von überall entfernt
  • Haben hinzugefügten Elemente (werden immer am Ende der Warteschlange)
  • Seien Sie schnell
  • gescannt
  • auf der Leistung Je hat einen Zeiger, wo es auf dem letzten Scan bekam.

Ich schrieb zunächst den Code, wenn ich wenig Erfahrung mit Java oder der API hatte, und verwenden nur eine Arraylist, weil ich es funktionieren würde wusste (nicht unbedingt, weil es die beste Option war).

Seine Leistung wird jetzt schlecht mit mehr und mehr Protokollen verarbeitet werden zu müssen - ja, welche Sammlung würden Sie empfehlen, in dieser Situation verwendet werden? Es gibt immer die Möglichkeit, meine eigenen zu schreiben.

Danke

War es hilfreich?

Lösung

LinkedHashSet könnte von Interesse sein. Es ist tatsächlich ein HashSet aber es unterhält auch eine LinkedList eine vorhersagbare Iterationsreihenfolge zu ermöglichen -. Und kann daher auch als FIFO-Warteschlange, mit dem netten zusätzlichen Vorteil verwendet werden, dass es keine doppelten Einträge enthalten

Weil es ein HashSet auch ist, sucht (im Gegensatz zu Scans gegen) kann O (1) sein, wenn sie auf equals() mithalten können

Andere Tipps

Ein LinkedList wäre wahrscheinlich am besten geeignet. Es verfügt über alle angeforderten Eigenschaften und ermöglicht Verbindungen von der Mitte in konstanter Zeit entfernt werden, anstatt der linearen Zeit für eine Arraylist erforderlich.

Wenn Sie etwas spezifische Strategie für das nächste Element zu finden, zu entfernen, eine Priorityqueue oder sogar eine sortierte Menge könnte besser geeignet sein.

schnell allgemein Gescannte impliziert eine Hash-basierte Implementierung von einer Art, ein ConcurrentSkipListMap könnte eine gute Umsetzung sein. Log (n) auf der ContainsKey, entfernen und erhalten Methoden und sortiert, so dass Sie eine Art Priorität zugeordnet sein kann.

Ich will nicht die Zeilen sortieren, werden gelesen (sie müssen in ihrer ursprünglichen Reihenfolge gehalten werden). Allerdings konnte ich möglicherweise die Leitungen blockieren basierend auf einer Sitzungs-ID, die jeweils protokolliert Zeile (mehrere protokolliert Zeilen pro Sitzung) hat.

Darüber nachzudenken, könnte ich möglicherweise ein:

HashMap<String,LinkedList<String>>

und die Session-ID als Schlüssel zur Verfügung stellen, und bevölkert die LinkedList mit den Linien der Sitzung gehören.

Die Karte würde einen schnellen Weg bieten, um die Suche nach Linien mit Sitzung X zu tun, und dann würde die verknüpfte Liste die beste Leistung zum Hinzufügen / Entfernen Linien (die Suchleistung war Linien zu finden, mit Session-x zu tun, deshalb die tatsächlichen Linien mit Session-x zu tun, können von Anfang bis Ende gelesen und entfernt werden -. geschoben / knallte)

Gibt es eine bessere Sammlung als die verknüpften Liste, die die Größe würde, haben Linien am Ende hinzugefügt und immer von Anfang genommen? Ich glaube, die Queue-Kollektion die verknüpfte Liste erstreckt eigentlich?

Weil Sie entfernen müssen und Elemente aus dem Satz hinzuzufügen, und die Suche nach bestimmten Werten, vielleicht eine bessere Struktur etwas sein könnte, die SortedSet, wie TreeSet implementiert. Diese Klasse garantiert log (n) Leistung für Hinzufügen, Entfernen und enthält.

Ich denke, einige Fäden in die Warteschlange schreiben werden und ein anderer wird von ihr lesen.

In diesem Fall, dass Sie an den Warteschlangen im java.lang.concurrent Paket aussehen sollten.

Sie können eine PriorityBlockingQueue verwenden zu lassen, um die Elemente für Sie zu bestellen, oder eine LinkedBlockingQueue wenn Sie über ihn zu durchlaufen möchten, und wählen Sie sich die Elemente zu entfernen.

Ich bin mit AVI und verknüpfte Liste wäre die beste Option sein. Sie können ganz einfach die Größe, schnell an das Ende der Liste hinzufügen, schnell von überall entfernen. Die Suche wird nicht schnell sein, aber auch nicht schlechter als jede andere unsortierten Liste.

Guava kann helfen.

  

Das Guava Projekt enthält mehrere Google-Kernbibliotheken, die wir verlassen uns auf in unseren Java-basierten Projekten. Sammlungen, Caching, Primitiven Unterstützung, Concurrency Bibliotheken, gemeinsame Anmerkungen, String-Verarbeitung, I / O und so weiter

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top