Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

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

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/Files

El ú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.

over 4 years ago · Santiago Trujillo
8 answers
Answer question

0

Veo 3 opciones para ti.

  1. Realmente debería considerar actualizar su hardware, hdd -> ssd upgrade puede multiplicar la velocidad de búsqueda por veces.

  2. 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.

  3. 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)

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

¿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.
over 4 years ago · Santiago Trujillo Report

0

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.

over 4 years ago · Santiago Trujillo Report

0

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

over 4 years ago · Santiago Trujillo Report

0

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á lo suficientemente bueno 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, 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), le quedan 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 mencionó que desea hacer esto en su sistema, pero como dije, no le daría ningún beneficio real y podría terminar perdiendo mucho tiempo (infraestructura y código) (tantos enfoques como se menciona 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 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.

  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 que se convierta en un cuello de botella dificultaría la búsqueda en su sistema local. y otra aplicación, 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.
over 4 years ago · Santiago Trujillo Report

0

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. Indexe 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 tome medio día nuevamente. Por lo tanto, preprocesar sus datos para crear un índice es claramente mejor que procesar 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.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!