Tengo una colección de archivos de texto que contienen datos médicos anónimos (edad, país, síntomas, diagnóstico, etc.). Estos datos datan de al menos 30 años, así que como pueden imaginar, tengo un conjunto de datos de gran tamaño. En total tengo alrededor de 20.000 archivos de texto por un total de aprox. 1 TB.
Periódicamente tendré que buscar en estos archivos las ocurrencias de una cadena en particular (no expresiones regulares). ¿Cuál es la forma más rápida de buscar a través de estos datos?
Intenté usar grep y buscar recursivamente en el directorio de la siguiente manera:
LC_ALL=C fgrep -r -i "searchTerm" /Folder/Containing/FilesEl único problema de hacer lo anterior es que lleva horas (¡a veces medio día!) buscar en estos datos.
¿Hay una forma más rápida de buscar a través de estos datos? En este momento, estoy abierto a diferentes enfoques, como bases de datos, búsqueda elástica, etc. Si sigo la ruta de la base de datos, tendré aprox. 1 billón de registros.
Mis únicos requisitos son:
1) La búsqueda se realizará en mi computadora local (CPU de doble núcleo y 8 GB de RAM)
2) Buscaré cadenas (no expresiones regulares).
3) Tendré que ver todas las apariciones de la cadena de búsqueda y el archivo en el que se encontraba.
Veo 3 opciones para ti.
Realmente debería considerar actualizar su hardware, hdd -> ssd upgrade puede multiplicar la velocidad de búsqueda por veces.
Aumente la velocidad de su búsqueda en el acto. Puede consultar esta pregunta para obtener varias recomendaciones. La idea principal de este método es optimizar la carga de la CPU, pero estará limitado por la velocidad de su HDD. El multiplicador de velocidad máxima es el número de sus núcleos.
Puede indexar su conjunto de datos. Debido a que está trabajando con textos, necesitará algunas bases de datos de búsqueda de texto completo. Elasticsearch y Postgres son buenas opciones. Este método requiere más espacio en disco (pero normalmente menos de x2 de espacio, según la estructura de datos y la lista de campos que desea indexar). Este método será infinitamente más rápido (segundos). Si decide utilizar este método, seleccione cuidadosamente la configuración del analizador para que coincida con lo que se considera una sola palabra para su tarea ( aquí hay un ejemplo para Elasticsearch)
Vale la pena cubrir el tema desde dos niveles: enfoque y software específico para usar.
Enfoque : según la forma en que describe los datos, parece que la indexación previa proporcionará una ayuda significativa. La preindexación realizará una exploración única de los datos y creará un índice compacto que hará posible realizar búsquedas rápidas e identificar dónde se muestran términos específicos en el repositorio.
Dependiendo de las consultas, el índice reducirá o eliminará por completo la necesidad de buscar en el documento real, incluso para consultas complejas como "buscar todos los documentos donde aparezcan AAA y BBB juntos".
Herramienta Específica
El hardware que describes es relativamente básico. Ejecutar búsquedas complejas se beneficiará de una gran memoria/hardware multinúcleo. Existen excelentes soluciones: la búsqueda elástica, solr y herramientas similares pueden hacer magia, con un hardware sólido que las admita.
Creo que desea buscar dos opciones, según sus habilidades, y los datos (ayudará a que se puedan compartir muestras de los datos) por OP. * Cree su propio índice, usando una base de datos liviana (sqlite, postgresql), O * Use un motor de búsqueda liviano.
Para el segundo enfoque, utilizando describir hardware, recomendaría buscar en 'glimpse' (y la utilidad agrep de soporte). Glimple proporciona una forma de indexar previamente los datos, lo que hace que las búsquedas sean extremadamente rápidas. Lo he usado en un gran repositorio de datos (pocos GB, pero nunca TB).
Ver: https://github.com/gvelez17/glimpse
Claramente, no es tan moderno y rico en funciones como Elastic Search, pero es mucho más fácil de configurar. Es sin servidor. El principal beneficio para el caso de uso descrito por OP es la capacidad de escanear archivos existentes, sin tener que cargar los documentos en un repositorio de motor de búsqueda adicional.
Fs Crawler podría ayudarlo a indexar los datos en elasticsearch. Después de eso, las consultas normales de elasticsearch pueden ser un motor de búsqueda.
¿Puede pensar en ingerir todos estos datos en elasticsearch si tienen un formato de estructura de datos consistente?
If yes, below are the quick steps: 1. Install filebeat on your local computer 2. Install elasticsearch and kibana as well. 3. Export the data by making filebeat send all the data to elasticsearch. 4. Start searching it easily from Kibana.Para agilizar tus búsquedas necesitas un índice invertido . Para poder agregar nuevos documentos sin necesidad de volver a indexar todos los archivos existentes, el índice debe ser incremental.
Uno de los primeros proyectos de código abierto que introdujo la indexación incremental es Apache Lucense. Sigue siendo el motor de indexación y búsqueda más utilizado aunque hoy en día son más populares otras herramientas que amplían su funcionalidad. Elasiticsearch y Solr están basados en Lucense. Pero siempre que no necesite una interfaz web, soporte para consultas analíticas, filtrado, agrupación, soporte para indexar archivos que no son de texto o una infraestructura para una configuración de clúster en múltiples hosts, Lucene sigue siendo la mejor opción.
Apache Lucense es una biblioteca de Java, pero viene con una aplicación de demostración basada en línea de comandos completamente funcional. Esta demostración básica ya debería proporcionar toda la funcionalidad que necesita.
Con algunos conocimientos de Java, también sería fácil adaptar la aplicación a sus necesidades. Te sorprenderá lo simple que es el código fuente de la aplicación de demostración. Si Java no debe ser el lenguaje de su elección, su envoltorio para Pyhton, PyLucene también puede ser una alternativa. La indexación de la aplicación de demostración ya está reducida casi al mínimo. De forma predeterminada, no se utiliza ninguna función avanzada como derivación u optimización para consultas complejas: características que probablemente no necesitará para su caso de uso, pero que aumentarían el tamaño del índice y el tiempo de indexación.
Creo que si almacena en caché los datos médicos buscados más recientes, podría ayudar en el rendimiento en lugar de pasar por todo el 1 TB, puede usar redis/memcached
Ya hay muchas respuestas, solo quería agregar mis dos centavos:
Sugerencia
En cuanto a la implementación, sugeriría hacerlo con Elasticsearch (ES), ya que es muy fácil de configurar y escalar, incluso puede usar AWS Elasticsearch , que también está disponible en el nivel gratuito y luego escalar rápidamente, aunque yo No soy un gran admirador de AWS ES, ahorra mucho tiempo de configuración y puede comenzar rápidamente si está muy familiarizado con ES.
Para que la búsqueda sea más rápida, puede dividir el archivo en varios campos (título, cuerpo, etiquetas, autor, etc.) e indexar solo el campo importante, lo que reduciría el tamaño del índice invertido y si solo busca la coincidencia exacta de cadenas ( sin búsqueda parcial o de texto completo), simplemente puede usar el campo de keyword que es aún más rápido para indexar y buscar.
Claramente necesita un índice, como ha sugerido casi todas las respuestas. Podrías mejorar totalmente tu hardware, pero como dijiste que está arreglado, no daré más detalles al respecto.
Tengo algunos consejos relevantes para ti:
Actualización menor:
Muchas respuestas aquí sugieren que coloque los datos en la nube. Recomiendo encarecidamente, incluso para datos médicos anónimos, que confirme con la fuente (a menos que haya extraído los datos de la web) que está bien hacerlo.