Pergunta

Aqui está o problema que estou tendo, tenho um conjunto de toras que podem crescer rapidamente. Eles são divididos em arquivos individuais todos os dias e os arquivos podem crescer facilmente até um show em tamanho. Para ajudar a manter o tamanho baixo, as entradas com mais de 30 dias são limpas.

O problema é quando eu quero pesquisar esses arquivos por uma determinada string. No momento, uma pesquisa de Boyer-Moore é inasterável. Sei que aplicativos como o DTSearch podem fornecer uma pesquisa realmente rápida usando a indexação, mas não tenho muita certeza de como implementá -lo sem ocupar o dobro do espaço que um log já ocupa.

Há algum recurso que eu possa conferir que possa ajudar? Estou realmente procurando um algoritmo padrão que explique o que devo fazer para criar um índice e usá -lo para pesquisar.

Editar:
Grep não funcionará, pois essa pesquisa precisa ser integrada a um aplicativo de plataforma cruzada. Não há como poderá balançar, incluindo qualquer programa externo nele.

A maneira como funciona é que há um front end da Web que possui um navegador de log. Isso fala com um back -end de servidor da Web C ++ personalizado. Este servidor precisa pesquisar os logs em um período de tempo razoável. Atualmente, a pesquisa de vários shows de toras leva séculos.

EDIT 2: Algumas dessas sugestões são ótimas, mas tenho que reiterar que não posso integrar outro aplicativo, faz parte do contrato. Mas, para responder a algumas perguntas, os dados nos logs variam de mensagens recebidas em um formato ou mensagens específicas de assistência médica relacionadas a elas. Estou procurando confiar em um índice, porque, embora possa levar um minuto para reconstruir o índice, a pesquisa atualmente leva muito tempo (eu já vi que levam até 2,5 minutos). Além disso, muitos dados são descartados antes mesmo de gravá -los. A menos que algumas opções de log de depuração sejam ativadas, mais da metade das mensagens de log são ignoradas.

A pesquisa é basicamente assim: um usuário no formulário da web é apresentado com uma lista das mensagens mais recentes (transmitidas do disco enquanto rolam, yay for Ajax), geralmente eles desejam procurar mensagens com algumas informações em Talvez um ID do paciente, ou alguma corda que eles enviaram e, para que possam entrar na string na pesquisa. A pesquisa é enviada asiconamente e o servidor da web personalizado pesquisa linearmente através dos logs 1 MB por vez para obter alguns resultados. Esse processo pode levar muito tempo quando os logs ficam grandes. E é o que estou tentando otimizar.

Foi útil?

Solução

Confira os algoritmos que o Lucene usa para fazer o que é. Eles não provavelmente não serão muito simples. Eu tive que estudar alguns desses algoritmos uma vez, e alguns deles são muito sofisticados.

Se você conseguir identificar as "palavras" no texto que deseja indexar, basta criar uma tabela de hash grande das palavras que mapeia um hash da palavra para suas ocorrências em cada arquivo. Se os usuários repetirem a mesma pesquisa com frequência, cache os resultados da pesquisa. Quando uma pesquisa é concluída, você pode verificar cada local para confirmar que o termo de pesquisa cai lá, em vez de apenas uma palavra com um hash correspondente.

Além disso, quem realmente se importa se o índice é maior que os próprios arquivos? Se o seu sistema é realmente tão grande, com tanta atividade, é algumas dezenas de shows para um índice o fim do mundo?

Outras dicas

grep Geralmente funciona muito bem para mim com grandes toras (às vezes 12g+). Você pode encontrar uma versão para Windows aqui também.

Provavelmente, você desejará integrar algum tipo de mecanismo de pesquisa de indexação em seu aplicativo. Existem dezenas por aí, Lucene parece ser muito popular. Verifique estas duas perguntas para obter mais algumas sugestões:

Melhor mecanismo de pesquisa de texto para integrar o aplicativo Web personalizado?

Como faço para implementar a funcionalidade de pesquisa em um site?

Mais detalhes sobre o tipo de pesquisa que você está realizando definitivamente pode ajudar. Por que, em particular, você deseja confiar em um índice, pois terá que reconstruí -lo todos os dias quando os troncos rolam? Que tipo de informação está nesses logs? Alguns deles podem ser descartados antes mesmo de serem gravados?

Quanto tempo essas pesquisas dão agora?

Você pode querer verificar a fonte do BSD grep. Você pode não ser capaz de confiar no Grep estar lá para você, mas nada diz que você não pode recriar funcionalidade semelhante, certo?

Splunk é ótimo para pesquisar muitos logs. Pode ser um exagero para o seu propósito. Você paga de acordo com o valor dos dados (tamanho dos logs) que deseja processar. Tenho certeza de que eles têm uma API para que você não precise usar o front-end, se não quiser.

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