Estoy trabajando en aproximadamente 1GB de archivo incremental y quiero buscar un patrón en particular. Actualmente estoy usando expresiones regulares de Java, ¿tienes alguna idea de cómo puedo hacer esto más rápido?¿Cómo puede la búsqueda de patrones hacer más rápido?
Respuesta
Básicamente lo que necesita es una máquina de estado que pueda procesar una secuencia. Esta secuencia está limitada al archivo ... Cada vez que crece el archivo, lee lo que se le ha agregado (como el comando tail linux que se agrega a la salida estándar de las líneas agregadas al archivo).
Si necesita detener/reiniciar su analizador, puede simplemente almacenar en algún lugar la posición de inicio (que puede depender de la ventana que necesite para la coincidencia de patrones) y reiniciar desde allí. O puede reiniciar desde cero.
Esto es para la parte de "aumento de archivos" del problema.
Para la mejor manera de procesar el contenido, depende de lo que realmente necesita, qué tipo de datos y patrón desea aplicar. La expresión regular es quizás la mejor solución: flexible, rápida y relativamente conveniente.
Desde mi entender, Lucene sería bueno si quisiera hacer una búsqueda de documentos que coincida con algún contenido de lenguaje natural. Esta sería una mala elección para hacer coincidir todas las fechas o todas las líneas con una propiedad específica. También porque Lucene primero hace un índice del documento ... Esto ayudaría solo para un procesamiento realmente pesado ya que la indexación en primer lugar toma tiempo.
Suena como un trabajo para Apache Lucene.
Probablemente tendrá que reconsiderar su estrategia de búsqueda, pero esta biblioteca está hecha para hacer cosas como esta y agregar índices de forma incremental.
Funciona mediante la creación de índices inversos de sus datos (documentos en el lenguaje de Lucene), y luego revisando rápidamente los índices inversos para los cuales los documentos tienen partes de su patrón.
Puede almacenar metadatos con los índices de documentos para que no tenga que consultar el archivo grande en la mayoría de los casos de uso.
El archivo que estoy analizando está creciendo por tiempo. Es posible hacer indexación. Acabo de descubrir que la expresión regular es más lenta. Tengo que usar algo como Thomson NFA. – Kamahire
Gracias Peter por una pronta respuesta. ¿Cómo puede usar Lucern para lo mismo? ¿Me puedes dar alguna muestra? – Kamahire
Lucene es bueno para procesar datos textuales con lenguaje natural adentro. Dependiendo del formato de su archivo y de su patrón, esta podría no ser la mejor solución. –
Puede intentar usar las clases Patrón y Matcher para buscar con expresiones compiladas.
Ver http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html y http://download.oracle.com/javase/tutorial/essential/regex/
o usar su motor de búsqueda favorito para buscar en los términos:
optimización java expresión regular o
rendimiento de Java expresión regular
He optimizado las expresiones regulares. He eliminado el retroceso. – Kamahire
¿Eso lo hizo más rápido? –
Creo que depende de:
- la estructura de los datos (orientado línea?)
- la complejidad del partido
- la velocidad a la que el archivo de datos está creciendo
Si los datos se orienta línea (o orientado al bloque) y debe producirse una coincidencia dentro de dicha unidad que puede coincidir hasta el último bloque completo, y almacenar la posición del archivo de ese punto final. La próxima exploración debería comenzar en ese punto final (posiblemente usando RandomAccessFile.seek()).
Esto ayuda especialmente si los datos no crecen tan rápido.
Si su partido es muy compleja, pero tiene un texto fijo distintivo, y el patrón no ocurre muy a menudo que puede ser más rápido por un String.contains() y sólo si eso es cierto aplicar el patrón. Como los patrones tienden a estar altamente optimizados, definitivamente no se garantiza que sean más rápidos.
Incluso puede pensar en reemplazar la expresión regular mediante la escritura manual de un analizador, posiblemente basado en StringTokenizer o algo así. Definitivamente, eso es mucho trabajo para hacerlo bien, pero le permitiría pasar algo de inteligencia adicional sobre los datos al analizador sintáctico, permitiéndole fallar rápidamente. Esto solo sería una buena opción si realmente sabes mucho sobre los datos que no puedes codificar en un patrón.
- 1. ¿Se puede hacer más rápido esta búsqueda amplia?
- 2. ¿Hay alguna manera de hacer esta búsqueda hash más rápido?
- 3. ¿Puede Regex hacer esto más rápido?
- 4. Búsqueda/análisis más rápido/seguro de archivos?
- 5. ¿Búsqueda de texto completo más rápido hoy?
- 6. más rápido método de búsqueda en StringBuilder
- 7. ¿Cómo hacer que doxygen funcione más rápido?
- 8. ¿Cómo hacer que JVM arranque más rápido?
- 9. ¿Cómo puedo hacer cout más rápido?
- 10. Más rápido que la búsqueda binaria para la lista ordenada
- 11. ¿Cómo hacer que un sitio web funcione más rápido?
- 12. Hacer que JAXB vaya más rápido
- 13. rápido algoritmo de búsqueda de sumas en la matriz
- 14. Hacer mi List.filter más rápido en Scala?
- 15. Cómo hacer que mi aplicación copie el archivo más rápido
- 16. Cómo hacer que el emulador de Android arranque más rápido
- 17. ¿Cómo hacer mazos de cuerda más rápido en emacs?
- 18. ¿Cómo eliminar más rápido?
- 19. ¿Cómo puedo hacer que Java3D comience más rápido?
- 20. ¿Cómo hacer que los fragmentos se carguen más rápido?
- 21. ¿Cómo hacer que este script sed sea más rápido?
- 22. ¿Cómo puedo hacer que Quartus II compile más rápido?
- 23. ¿Cómo hacer que este Twisted Python Proxy sea más rápido?
- 24. ¿Cómo hacer que mis emacs personalizados carguen más rápido?
- 25. Cómo hacer que el eclipse IDE se construya más rápido
- 26. ¿Cómo puedo hacer que Matlab Compiler funcione más rápido?
- 27. badoo.com búsqueda de usuarios: ¿cómo se puede hacer esto?
- 28. ¿Cuál es la técnica/método de búsqueda más rápido? (En el contexto de la búsqueda de archivos)
- 29. ¿Cómo es la búsqueda de Amazon Faceted tan rápido?
- 30. ¿Cómo crear índice más rápido?
Suena como que esto debe ser vinculado a E/S. ¿Qué tan rápido funciona un programa que simplemente lee (y descarta) el contenido del archivo? Las expresiones regulares deberían poder acercarse a la misma velocidad, o si algo está yendo mal (como el almacenamiento en búfer). Si simplemente leer el archivo es demasiado lento para sus propósitos, entonces debe considerar un enfoque diferente (c.f. la discusión de Lucene a continuación). –
Puedes mostrar el patrón y un poco del archivo. Tal vez la expresión es lenta porque no es óptima. ¿Su programa carga todo el contenido del archivo en una cadena para luego ejecutar la expresión regular? ¿Esa es la parte lenta? –