c# - usar - leer varios valores de un archivo de texto en php
Manera más rápida de buscar una cadena en archivos de texto (5)
Debe considerar usar la búsqueda de archivos del sistema operativo con los contenidos. Eche un vistazo al SDK de Microsoft Windows Search 3.x
O puede utilizar PLINQ para buscar en una matriz de archivos. Ver este enlace:
Contenido de archivo y búsqueda de directorio usando Directory.GetFiles y PLINQ
Necesito buscar una cadena, aproximadamente 13 caracteres, en un grupo de archivos de texto usando C #. La cantidad de archivos de texto está cambiando y puede oscilar entre 100-1000. El tamaño de los archivos puede oscilar entre 1 KB y 10 MB.
Intenté la forma ingenua de abrir cada archivo, leerlo línea por línea y ver si existe la cadena (usando index.of), pero esto es demasiado lento. También probé usando el algoritmo Boyer-Moore, que mejoró el tiempo, en 5 segundos, pero aún así parece lento.
¿Alguna idea sobre cómo acelerar la búsqueda?
Dos opciones vienen a la mente:
Lectura de su archivo de texto en la memoria y simplemente buscar toda la cadena de una vez.
Si eso resulta ser demasiado lento o tiene mucha memoria, use un indexador como Apache Lucene. Hay un SDK agradable y fácil para el disponible para .NET, llamado Lucene.net
Aquí hay una pequeña introducción: http://www.codeproject.com/Articles/29755/Introducing-Lucene-Net
Puede usar el servicio de indexación de Microsoft para buscar documentos en las carpetas que agregaría en el catálogo. Aquí hay un artículo muy bueno que puedes usar para buscar tus archivos de texto
Dependiendo de cuántas veces quieras hacer la ''búsqueda'', quieres usar un motor de búsqueda o no. Si desea buscar muchas veces, utilice un motor de búsqueda; de lo contrario, no lo haga. Voy a describir cómo implementar ambos escenarios aquí.
Al usar un motor de búsqueda: Parece que está buscando subcadenas, lo que significa que debe indexar sus archivos como tal utilizando su motor de búsqueda favorito, preferiblemente uno que puede personalizar (lucene, terrier, etc.). La técnica que necesita aquí es indexar trigramas, es decir: todas las combinaciones de 3 caracteres deben indexarse. F.ex .: ''foobar'' generará ''foo'', ''oob'', ''oba'' y ''bar''. Al realizar una búsqueda, desea hacer lo mismo con su consulta y emitir una consulta en el motor de búsqueda con la Y de todos estos trigramas. (Eso ejecutará una combinación de fusión en las listas de publicación de los documentos, que devolverá sus ID o lo que sea que coloque en las listas de publicación).
Alternativamente, puede implementar matrices de sufijos e indexar sus archivos una vez. Esto le dará un poco más de flexibilidad si desea buscar subcadenas cortas (1-2 char), pero en términos de índices es más difícil de mantener. (Hay algunas investigaciones en CWI / Amsterdam para matrices de sufijo de indexación rápida)
Cuando desea buscar solo unas pocas veces, el algoritmo que debe usar es Boyer-Moore (generalmente uso Boyer-moore-sunday como se describe en [Graham A. Stephen, String Search]) o un DFA compilado (puede construirlos) de un NFA, que es más fácil de hacer). Sin embargo, eso solo le dará un pequeño aumento de velocidad, por la sencilla razón de que el disco IO es probablemente su cuello de botella y la comparación de un grupo de bytes que necesita decodificar de todos modos es bastante rápido.
La mayor mejora que puede hacer es no leer su archivo línea por línea, sino en bloques. Debe configurar NTFS para usar un tamaño de bloque de 64 KB si puede y leer los archivos en multiplicaciones de 64 KB, piense en 4 MB o más en una sola lectura. Incluso sugiero usar IO asíncrono para que pueda leer y procesar (datos leídos previamente) al mismo tiempo. Si lo hace correctamente, eso ya debería darle una implementación de fracción de segundo para 10 MB en la mayoría de los equipos modernos.
Por último, pero no por ello menos importante, un buen truco utilizado en la recuperación de información es también comprimir los datos mediante un algoritmo de compresión rápida. Como el disco IO es más lento que las operaciones de memoria / CPU, probablemente también lo ayude. El compresor Snappy de Google es un buen ejemplo de un algoritmo de compresión rápida.
Si su computadora puede manejarlo, intente cargar todos los archivos de texto en la memoria (usando la técnica que se muestra aquí y luego evalúe el texto en la memoria).
Si no puede manejar todos los archivos al mismo tiempo, haga esto para los archivos más pequeños. La E / S de archivo va a ser su mayor gasto aquí, por lo que desea minimizar eso tanto como sea posible.