Pregunta

Aquí está el problema que tengo, tengo un conjunto de registros que pueden crecer bastante rápido. Se dividen en archivos individuales todos los días, y los archivos pueden crecer fácilmente hasta alcanzar un tamaño de concierto. Para ayudar a mantener el tamaño hacia abajo, se borran las entradas de más de 30 días o más.

El problema es cuando quiero buscar en estos archivos una cadena determinada. En este momento, una búsqueda de Boyer-Moore es demasiado lenta. Sé que las aplicaciones como dtSearch pueden proporcionar una búsqueda realmente rápida utilizando la indexación, pero no estoy realmente seguro de cómo implementar eso sin ocupar el doble del espacio que ocupa un registro.

¿Hay algún recurso que pueda revisar que pueda ayudar? Realmente estoy buscando un algoritmo estándar que explique lo que debo hacer para crear un índice y usarlo para buscar.

Editar:
Grep no funcionará ya que esta búsqueda debe integrarse en una aplicación multiplataforma. No hay forma de que pueda incluir un programa externo en cualquier momento.

La forma en que funciona es que hay un front-end web que tiene un navegador de registro. Esto habla con un servidor web personalizado de C ++. Este servidor necesita buscar los registros en un tiempo razonable. La búsqueda actual a través de varios conciertos de registros lleva mucho tiempo.

Edición 2: Algunas de estas sugerencias son excelentes, pero debo reiterar que no puedo integrar otra aplicación, es parte del contrato. Pero para responder algunas preguntas, los datos en los registros varían de los mensajes recibidos en un formato específico de atención médica o de los mensajes relacionados. Busco confiar en un índice porque, si bien la reconstrucción del índice puede demorar hasta un minuto, actualmente la búsqueda lleva mucho tiempo (he visto que toma hasta 2,5 minutos). Además, muchos de los datos se descartan incluso antes de grabarlos. A menos que algunas opciones de registro de depuración estén activadas, más de la mitad de los mensajes de registro se ignoran.

La búsqueda básicamente es así: a un usuario en el formulario web se le presenta una lista de los mensajes más recientes (transmitidos desde el disco a medida que se desplazan, yay para ajax), por lo general, querrán buscar mensajes con alguna información en él, tal vez una identificación del paciente, o alguna cadena que han enviado, y así pueden ingresar la cadena en la búsqueda. La búsqueda se envía de forma asíncrona y el servidor web personalizado busca de forma lineal a través de los registros de 1 MB a la vez para obtener algunos resultados. Este proceso puede llevar mucho tiempo cuando los registros se vuelven grandes. Y es lo que estoy tratando de optimizar.

¿Fue útil?

Solución

Echa un vistazo a los algoritmos que Lucene utiliza para hacer su cosa. Aunque no es probable que sean muy simples. Tuve que estudiar algunos de estos algoritmos una vez, y algunos de ellos son muy sofisticados.

Si puede identificar las " palabras " en el texto que desea indexar, simplemente cree una tabla hash grande de palabras que asigne un hash de la palabra a sus apariciones en cada archivo. Si los usuarios repiten la misma búsqueda con frecuencia, almacene en caché los resultados de la búsqueda. Cuando se realiza una búsqueda, puede verificar cada ubicación para confirmar que el término de búsqueda cae allí, en lugar de solo una palabra con un hash correspondiente.

Además, ¿a quién le importa si el índice es más grande que los archivos en sí? Si su sistema es realmente tan grande, con tanta actividad, ¿son unas pocas docenas de conciertos para un índice el fin del mundo?

Otros consejos

grep generalmente funciona bastante bien para mí con grandes registros (a veces 12G +). Puede encontrar una versión para Windows aquí también.

Lo más probable es que desee integrar algún tipo de motor de búsqueda de indexación en su aplicación. Hay docenas por ahí, Lucene parece ser muy popular. Compruebe estas dos preguntas para algunas sugerencias más:

El mejor motor de búsqueda de texto para la integración con la web personalizada aplicación?

¿Cómo implemento la funcionalidad de búsqueda en un sitio web?

Definitivamente, más detalles sobre el tipo de búsqueda que está realizando podrían ayudar. ¿Por qué, en particular, desea confiar en un índice, ya que tendrá que reconstruirlo todos los días cuando se reinician los registros? ¿Qué tipo de información hay en estos registros? ¿Se puede descartar un poco antes de que se grabe?

¿Cuánto tiempo toman estas búsquedas ahora?

Es posible que desee revisar la fuente de BSD grep . Es posible que no pueda confiar en que grep esté allí para usted, pero nada dice que no puede recrear una funcionalidad similar, ¿verdad?

Splunk es ideal para buscar en muchos registros. Puede ser una exageración para su propósito. Usted paga según la cantidad de datos (tamaño de los registros) que desea procesar. Estoy bastante seguro de que tienen una API, por lo que no tienes que usar su interfaz de usuario si no quieres.

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