GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo acelerar una búsqueda en una gran colección de archivos de texto (1 TB)

Ya hay muchas respuestas, solo quería agregar mis dos centavos:

  1. Tener esta gran cantidad de datos (1 TB) con solo 8 GB de memoria no será suficiente para ningún enfoque, ya sea usando Lucene o Elasticsearch (internamente usa Lucene) o algún comando grep si desea una búsqueda más rápida, el la razón es muy simple, todos estos sistemas mantienen los datos en la memoria más rápida para poder servir más rápido y de 8 GB (25% debe reservarse para el sistema operativo y otro 25-50% al menos para otra aplicación), se queda con muy pocos GB de RAM.
  2. Actualizar el SSD, aumentar la RAM en su sistema ayudará, pero es bastante engorroso y, nuevamente, si tiene problemas de rendimiento, será difícil escalar verticalmente su sistema.

Sugerencia

  1. Sé que ya mencionaste que quieres hacer esto en tu sistema, pero como dije, no daría ningún beneficio real y podrías terminar perdiendo mucho tiempo (infraestructura y código) (tantos enfoques como se mencionó en varias respuestas)), por lo tanto, le sugiero que realice el enfoque de arriba hacia abajo como se menciona en mi otra respuesta para determinar la capacidad correcta. Le ayudaría a identificar rápidamente la capacidad correcta de cualquier enfoque que elija.
  2. 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.

  3. Para hacer 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 keyword campo que es aún más rápido para indexar y buscar.

  4. Puedo seguir explicando por qué Elasticsearch es bueno y cómo optimizarlo, pero ese no es el quid y la conclusión es que cualquier búsqueda necesitará una cantidad significativa de memoria, CPU y disco, y cualquiera podría convertirse en un cuello de botella. dificultaría la búsqueda de su sistema local y otras aplicaciones, por lo tanto, le recomendamos que realmente considere hacer esto en un sistema externo y Elasticsearch realmente se destaca como su medio para el sistema distribuido y el sistema de búsqueda de código abierto más popular en la actualidad.

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:

  1. Indice solo los campos en los que desea encontrar el término de búsqueda en lugar de indexar todo el conjunto de datos;
  2. Cree un índice multinivel (es decir, índice sobre índice) para que sus búsquedas de índice sean más rápidas. Esto será especialmente relevante si su índice crece a más de 8 GB;
  3. Quería recomendar el almacenamiento en caché de sus búsquedas como alternativa, pero esto hará que una nueva búsqueda tarde medio día. Por lo tanto, el preprocesamiento de sus datos para crear un índice es claramente mejor que el procesamiento de los datos a medida que llega la consulta.

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.


Para acelerar 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 mientras no necesite una interfaz web, compatibilidad con consultas analíticas, filtrado, agrupación, compatibilidad con la indexación de archivos que no son de texto o una infraestructura para la configuración de un clúster en varios 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:funciones que probablemente no necesitará para su caso de uso, pero que aumentarían el tamaño del índice y el tiempo de indexación.


Linux
  1. Cómo usar el comando Grep para buscar texto en archivos

  2. Cómo unir dos archivos de texto en Linux

  3. Cómo buscar archivos grandes en la consola

  4. ¿Cómo encontrar archivos en Ubuntu?

  5. Búsqueda rápida de texto en más de 600.000 archivos

Bash scripting:cómo escribir datos en archivos de texto

Cómo mover una gran cantidad de archivos en Linux

Cómo copiar una gran cantidad de archivos en Linux

Cómo encontrar archivos que contengan una cadena de texto específica en Linux

Cómo Gzip archivos grandes (100GB+) más rápido en Linux

Cómo usar más comandos en Linux para leer archivos de texto grandes