Question

Voici le problème que j'ai, j’ai un ensemble de journaux pouvant croître assez rapidement. Chaque jour, ils sont scindés en fichiers individuels qui peuvent facilement atteindre la taille d'un gigaoctet. Pour réduire la taille, les entrées de plus de 30 jours sont effacées.

Le problème vient du moment où je souhaite rechercher dans ces fichiers une certaine chaîne. À l’heure actuelle, une recherche de Boyer-Moore est trop lente. Je sais que des applications telles que dtSearch peuvent fournir une recherche très rapide à l'aide de l'indexation, mais je ne sais pas trop comment le mettre en œuvre sans occuper le double de l'espace qu'un journal occupe déjà.

Existe-t-il des ressources que je peux consulter et qui peuvent aider? Je cherche vraiment un algorithme standard qui explique ce que je devrais faire pour construire un index et l'utiliser pour la recherche.

Modifier:
Grep ne fonctionnera pas car cette recherche doit être intégrée dans une application multiplate-forme. Il est impossible que je puisse intégrer un programme externe à ce programme.

La façon dont cela fonctionne est qu’il existe un frontal Web doté d’un navigateur de journaux. Cette conversation avec un serveur Web C ++ personnalisé. Ce serveur doit rechercher les journaux dans un délai raisonnable. Actuellement, il faut une éternité pour parcourir plusieurs concerts de journaux.

Modifier 2: Certaines de ces suggestions sont excellentes, mais je dois rappeler que je ne peux pas intégrer une autre application, cela fait partie du contrat. Mais pour répondre à certaines questions, les données dans les journaux varient soit des messages reçus dans un format spécifique aux soins de santé, soit des messages les concernant. Je compte utiliser un index car, bien que la reconstruction de l'index puisse prendre jusqu'à une minute, la recherche prend actuellement beaucoup de temps (je l'ai déjà vu prendre jusqu'à 2,5 minutes). En outre, une grande partie des données est supprimée avant même de l’enregistrer. À moins que certaines options de journalisation de débogage ne soient activées, plus de la moitié des messages du journal sont ignorés.

La recherche ressemble en gros à ceci: Un utilisateur du formulaire Web se voit présenter une liste des messages les plus récents (diffusés à partir du disque au fur et à mesure qu'ils défilent, yay pour ajax). Ils souhaitent généralement rechercher les messages avec certaines informations qu'il contient, par exemple un identifiant de patient ou une chaîne qu'ils ont envoyée, peuvent ainsi entrer la chaîne dans la recherche. La recherche est envoyée de manière asynchrone et le serveur Web personnalisé effectue une recherche linéaire dans les journaux, 1 Mo à la fois, à la recherche de certains résultats. Ce processus peut prendre beaucoup de temps lorsque les journaux deviennent volumineux. Et c’est ce que j’essaie d’optimiser.

Était-ce utile?

La solution

Découvrez les algorithmes que Lucene utilise pour faire son travail. Ils ne sont pas susceptibles d'être très simple, cependant. J'ai dû étudier certains de ces algorithmes une fois, et certains d'entre eux sont très sophistiqués.

Si vous pouvez identifier les " mots " dans le texte que vous souhaitez indexer, créez simplement une grande table de hachage des mots qui mappe un hachage du mot sur ses occurrences dans chaque fichier. Si les utilisateurs répètent fréquemment la même recherche, mettez en cache les résultats de la recherche. Lorsqu'une recherche est terminée, vous pouvez alors vérifier chaque emplacement pour confirmer que le terme de recherche y tombe, plutôt que juste un mot avec un hachage correspondant.

De plus, qui se soucie vraiment si l’index est plus volumineux que les fichiers eux-mêmes? Si votre système est vraiment aussi gros, avec autant d’activité, quelques dizaines de concerts pour un index sont-ils la fin du monde?

Autres conseils

grep fonctionne généralement assez bien pour moi avec de gros journaux (parfois 12G +). Vous pouvez trouver une version pour Windows ici .

Vous souhaiterez probablement intégrer un type de moteur de recherche d'indexation dans votre application. Il y en a des dizaines, Lucene semble être très populaire. Vérifiez ces deux questions pour d’autres suggestions:

meilleur moteur de recherche de texte pour l'intégration à des sites Web personnalisés app?

Comment puis-je implémenter la fonctionnalité de recherche dans un site Web?

Plus de détails sur le type de recherche que vous effectuez pourraient certainement aider. Pourquoi, en particulier, souhaitez-vous vous fier à un index, car vous devrez le reconstruire chaque jour lorsque les journaux seront remplacés? Quel type d'informations se trouve dans ces journaux? Peut-on en jeter une partie avant même son enregistrement?

Combien de temps ces recherches prennent-elles maintenant?

Vous pouvez vérifier la source de BSD grep . Vous ne pouvez peut-être pas compter sur la présence de grep, mais rien ne dit que vous ne pouvez pas recréer des fonctionnalités similaires, n'est-ce pas?

Splunk est idéal pour effectuer des recherches dans de nombreux journaux. Peut être exagéré pour votre but. Vous payez en fonction de la quantité de données (taille des journaux) que vous souhaitez traiter. Je suis presque sûr qu'ils ont une API, vous n'avez donc pas à utiliser leur interface si vous ne le souhaitez pas.

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