Pregunta

Estoy leyendo archivos de registro, pero no todas las líneas quieren procesarse de inmediato. Estoy usando una cola / buffer para almacenar las líneas mientras esperan ser procesadas.

Esta cola se explora regularmente en busca de líneas particulares: cuando se encuentran, se eliminan de la cola (pueden estar en cualquier lugar de la misma). Cuando no se puede encontrar una línea en particular, las líneas se sacan del inicio de la cola una por una para ser procesadas.

Por lo tanto, la cola necesita lo siguiente:

  • Se puede cambiar el tamaño (o dar esa impresión)
  • Eliminar elementos de cualquier lugar
  • Tener elementos agregados (siempre estarán al final de la cola)
  • Escanear rápidamente
  • Dependiendo del rendimiento, tenga un puntero de dónde llegó en el último escaneo.

Inicialmente escribí el código cuando tenía poca experiencia con Java o la API, y simplemente usé una ArrayList porque sabía que funcionaría (no necesariamente porque era la mejor opción).

Su rendimiento ahora se está volviendo pobre con más y más registros que necesitan ser procesados, entonces, ¿qué colección recomendaría usar en esta situación? Siempre existe la posibilidad de escribir el mío también.

Gracias

¿Fue útil?

Solución

LinkedHashSet puede ser de interés. Efectivamente es un HashSet, pero también mantiene una LinkedList para permitir un orden de iteración predecible, y por lo tanto también se puede usar como una cola FIFO, con el beneficio adicional de que no puede contener entradas duplicadas.

Debido a que también es un HashSet, las búsquedas (a diferencia de los escaneos) pueden ser O (1) si pueden coincidir en equals()

Otros consejos

Una LinkedList probablemente sería lo más apropiado. Tiene todas las propiedades solicitadas y permite que los enlaces se eliminen del medio en tiempo constante, en lugar del tiempo lineal requerido para una ArrayList.

Si tiene alguna estrategia específica para encontrar el siguiente elemento para eliminar, un PriorityQueue o incluso un conjunto ordenado podría ser más apropiado.

Escaneado rápidamente generalmente implica una implementación basada en hash de algún tipo, un ConcurrentSkipListMap podría ser una buena implementación. Inicie sesión (n) en la clave contiene, elimine y obtenga métodos, y se ordena para que pueda tener algún tipo de prioridad asociada.

No quiero ordenar las líneas que se leen (deben mantenerse en su orden original). Sin embargo, podría bloquear las líneas en función de un ID de sesión que tenga cada línea registrada (varias líneas registradas por sesión).

Pensando en ello, podría tener un:

HashMap<String,LinkedList<String>>

y proporcione el ID de sesión como la clave, y complete la LinkedList con las líneas que pertenecen a la sesión.

El Mapa proporcionaría una forma rápida de buscar líneas relacionadas con la sesión X, y luego la lista vinculada proporcionaría el mejor rendimiento para agregar / eliminar líneas (el rendimiento de búsqueda fue encontrar líneas relacionadas con la sesión x, por lo tanto las líneas reales que tienen que ver con la sesión x se pueden leer y eliminar de principio a fin - presionadas / reventadas).

¿Hay una colección mejor que la lista vinculada que cambiaría de tamaño, tendría líneas agregadas al final y siempre tomadas desde el principio? ¿Creo que la colección Queue extiende la lista vinculada de todos modos?

Debido a que necesita eliminar y agregar elementos del conjunto y buscar valores específicos, tal vez una mejor estructura podría ser algo que implemente SortedSet, como TreeSet. Esta clase garantiza el rendimiento del registro (n) para agregar, eliminar y contiene.

Supongo que algunos hilos se escribirán en la cola y otro leerá de ellos.

En este caso, debe mirar las colas en el paquete java.lang.concurrent.

Puede usar un PriorityBlockingQueue para que ordene los elementos por usted, o un LinkedBlockingQueue si desea iterar sobre él y elegir los elementos que desea eliminar.

Estoy de acuerdo con AVI y la lista vinculada sería su mejor opción. Puede cambiar el tamaño fácilmente, agregar rápidamente al final de la lista, eliminar rápidamente de cualquier lugar. La búsqueda no será rápida, pero no peor que cualquier otra lista sin ordenar.

Guava puede ayudar.

  

El proyecto Guava contiene varias de las bibliotecas principales de Google en las que confiamos en nuestros proyectos basados ??en Java: colecciones, almacenamiento en caché, compatibilidad con primitivas, bibliotecas de concurrencia, anotaciones comunes, procesamiento de cadenas, E / S, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top