Question

Je lis les fichiers journaux mais toutes les lignes ne veulent pas être traitées immédiatement. J'utilise une file d'attente / un tampon pour stocker les lignes en attente de traitement.

Cette file d'attente est régulièrement analysée à la recherche de lignes particulières. Lorsqu'elles sont détectées, elles sont supprimées de la file d'attente (elles peuvent figurer n'importe où dans celle-ci). Lorsqu'il n'y a pas de ligne particulière à trouver, les lignes sont extraites une à une du début de la file d'attente pour être traitées.

Par conséquent, la file d'attente a besoin des éléments suivants:

  • Peut être redimensionné (ou donner cette impression)
  • Supprimer des éléments de n'importe où
  • Ajouter des éléments (sera toujours à la fin de la file d'attente)
  • être analysé rapidement
  • En fonction des performances, indiquez un pointeur sur la dernière analyse.

J’ai initialement écrit le code alors que j’avais peu d’expérience de Java ou de l’API. Je viens d’utiliser une liste ArrayList car je savais que cela fonctionnerait (pas nécessairement parce que c’était la meilleure option).

Ses performances sont en train de devenir médiocres et de plus en plus de journaux doivent être traités. Quelle collection recommanderiez-vous d’utiliser dans cette situation? Il y a toujours la possibilité d'écrire le mien aussi.

Merci

Était-ce utile?

La solution

LinkedHashSet pourrait être intéressant. Il s’agit en réalité d’un hachage, mais il gère également une liste liée pour permettre un ordre d’itération prévisible - et peut donc également être utilisé comme file d'attente FIFO, avec l'avantage supplémentaire qu'il ne peut pas contenir d'entrées en double.

Puisqu'il s'agit également d'un hachage, les recherches (par opposition aux analyses) peuvent être O (1) si elles peuvent correspondre à equals ()

Autres conseils

Une LinkedList serait probablement la plus appropriée. Il possède toutes les propriétés demandées et permet de supprimer les liens du milieu en temps constant, plutôt que le temps linéaire requis pour un ArrayList.

Si vous avez une stratégie spécifique pour trouver le prochain élément à supprimer, une PriorityQueue ou même un ensemble trié peut être plus approprié.

Une analyse rapide implique généralement une implémentation basée sur le hachage, un ConcurrentSkipListMap peut être une bonne implémentation. Log (n) sur la contient, les méthodes remove et get, et est trié afin que vous puissiez avoir une sorte de priorité associée.

Je ne veux pas trier les lignes lues (elles doivent être conservées dans leur ordre d'origine). Cependant, je pourrais éventuellement bloquer les lignes en fonction d'un ID de session que chaque ligne enregistrée contient (plusieurs lignes enregistrées par session).

En y réfléchissant, je pourrais éventuellement avoir un:

HashMap<String,LinkedList<String>>

et indiquez l'identifiant de session comme clé, puis remplissez la liste LinkedList avec les lignes appartenant à la session.

La carte fournirait un moyen rapide de rechercher des lignes à faire avec la session X, puis la liste chaînée fournirait les meilleures performances pour ajouter / supprimer des lignes (la recherche consistait à trouver des lignes à faire avec la session x, donc les lignes à effectuer avec la session x peuvent être lues et supprimées du début à la fin - poussées / sautées).

Existe-t-il une meilleure collection que la liste chaînée qui redimensionnerait, aurait des lignes ajoutées à la fin et toujours prises depuis le début? Je pense que la collection de files d’attente prolonge quand même la liste chaînée?

Etant donné que vous devez supprimer et ajouter des éléments à l'ensemble et rechercher des valeurs spécifiques, une meilleure structure pourrait être quelque chose qui implémenterait SortedSet, tel que TreeSet. Cette classe garantit les performances log (n) pour l’ajout, la suppression et le contenu.

Je suppose que certains threads vont écrire dans la file d'attente et qu'un autre le lira.

Dans ce cas, vous devriez regarder les files d'attente du paquet java.lang.concurrent.

Vous pouvez utiliser PriorityBlockingQueue pour lui permettre de classer les éléments pour vous, ou une LinkedBlockingQueue si vous souhaitez effectuer une itération dessus et choisir vous-même les éléments à supprimer.

Je suis d’accord avec AVI et la liste chaînée serait votre meilleure option. Vous pouvez facilement redimensionner, ajouter rapidement à la fin de la liste, supprimer rapidement de n'importe où. La recherche ne sera pas rapide, mais pas pire que toute autre liste non triée.

Guava peut vous aider.

  

Le projet Guava contient plusieurs des bibliothèques principales de Google sur lesquelles nous nous appuyons dans nos projets basés sur Java: collections, mise en cache, prise en charge des primitives, bibliothèques de concurrence, annotations courantes, traitement des chaînes, E / S, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top