Pergunta

Estou a ler arquivos de log, mas nem todas as linhas quer ser processado imediatamente. Eu estou usando uma fila / buffer para armazenar as linhas enquanto esperam para ser processado.

Esta fila é regularmente verificados quanto a linhas particulares - quando elas são encontradas, que são removidos da fila (que pode ser em qualquer parte dela). Quando não há uma linha particular a ser encontrado, as linhas são retiradas do início da fila de um por um para ser processado.

Portanto, a fila precisa o seguinte:

  • Capaz de ser redimensionada (ou dar essa impressão)
  • têm elementos retirados de qualquer lugar
  • Tem elementos adicionado (será sempre no final da fila)
  • ser digitalizados rapidamente
  • Dependendo do desempenho, tem um ponteiro de onde ele conseguiu na última verificação.

I inicialmente escreveu o código quando eu tinha pouca experiência de Java ou a API, e apenas utilizado um ArrayList porque eu sabia que ele iria trabalhar (não necessariamente porque era a melhor opção).

Seu desempenho está agora a tornar-se pobre, com mais e mais logs de precisar ser processado - por isso, o que coleção que você recomendaria para ser usado nesta situação? Há sempre a possibilidade de escrever meu próprio também.

Graças

Foi útil?

Solução

LinkedHashSet pode ser do seu interesse. É efetivamente um HashSet mas também mantém um LinkedList para permitir que uma ordem de iteração previsível -. E, portanto, também pode ser usado como uma fila FIFO, com o benefício agradável acrescentou que não pode conter entradas duplicadas

Porque é um HashSet também, pesquisas (ao contrário de exames) pode ser O (1) se eles podem corresponder em equals()

Outras dicas

A LinkedList provavelmente seria mais adequado. Ele tem todas as propriedades solicitadas, e permite ligações a ser removido a partir do meio em tempo constante, em vez do tempo linear necessário para um ArrayList.

Se você tem alguma estratégia específica para encontrar o próximo elemento de remover, uma PriorityQueue ou mesmo um conjunto classificado pode ser mais apropriado.

digitalizado rapidamente geralmente implica uma implementação baseado em hash de algum tipo, um ConcurrentSkipListMap pode ser uma boa implementação. Log (n) na ContainsKey, remover e obter métodos, e é classificada para que possa ter algum tipo de prioridade associada a ele.

Eu não quero classificar as linhas que está sendo lido (eles precisam ser mantidos em sua ordem original). No entanto, eu poderia potencialmente bloquear as linhas com base em uma ID de sessão que cada linha logged tem (várias linhas registradas por sessão).

Pensando nisso, eu poderia potencialmente ter um:

HashMap<String,LinkedList<String>>

e fornecer a identificação da sessão como a chave, e preencher o LinkedList com as linhas pertencentes à sessão.

O Mapa iria fornecer uma maneira rápida de procurar por linhas a ver com sessão X, em seguida, a lista ligada iria fornecer o melhor desempenho para adicionar / linhas de remover (o desempenho pesquisa era encontrar linhas para fazer com sessão x, portanto, as linhas reais para fazer com sessão x pode ser lido e removido do início ao fim -. empurrada / estalado)

Existe uma coleção melhor do que a lista ligada que redimensionar, têm linhas adicionadas no final e sempre tomadas desde o início? Eu acredito que a coleção Queue estende a lista ligada de qualquer maneira?

Porque você precisa remover e adicionar elementos do conjunto, e procurar valores específicos, talvez uma melhor estrutura poderia ser algo que implementa SortedSet, como TreeSet. Esta classe garantias log desempenho (n) para adicionar, remover e contém.

Eu acho que algumas linhas estão indo para escrever para a fila e outra vai lê-lo.

Neste caso, você deve olhar para as filas no pacote java.lang.concurrent.

Você pode usar um PriorityBlockingQueue para deixá-lo ordenar os elementos para você, ou um LinkedBlockingQueue se você quiser iterar sobre ele e escolha-se os elementos de remover.

Eu concordo com AVI e lista ligada seria sua melhor opção. Você pode facilmente redimensionar, adicionar rapidamente para o fim da lista, remover rapidamente de qualquer lugar. Searching não será rápido, mas não é pior do que qualquer outra lista não classificada.

Goiaba pode ajudar.

O projeto goiaba contém várias bibliotecas do Google centrais que dependem de nós em nossos projetos baseados em Java:. Coleções, caching, primitivas apoiar, bibliotecas de simultaneidade, anotações comuns, processamento de corda, I / O, e assim por diante

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top