2010-03-25 7 views
13

El software patentado de mi empresa genera un archivo de registro que es mucho más fácil de usar si se analiza. El analizador de registros que todos usamos fue escrito por otro empleado como un proyecto paralelo y tiene un rendimiento horrible.¿Qué idioma debo usar para escribir un analizador de texto y mostrar los resultados de una manera fácil de usar?

Estos archivos de registro pueden crecer a 10s de megabytes muy rápidamente, y el analizador que usamos actualmente tiene problemas si un archivo de registro es más grande que 1 megabyte.

Por lo tanto, quiero escribir un programa que pueda analizar esta gran cantidad de texto en el menor tiempo posible. Utilizamos Windows exclusivamente, por lo que ejecutar en Windows es imprescindible. Nuestra implementación actual se ejecuta en un servidor web local, y estoy convencido de que ejecutarlo como una aplicación debería ser más rápido.

Todas las sugerencias serán útiles. Gracias.

EDIT: Mi objetivo final es analizar el texto y mostrarlo de una manera mucho más amigable con los colores y más. ¿Puedes hacer esto con Perl y Python? Sé que puedes hacer esto con Java y C++. Por lo tanto, funcionará como el Bloc de notas donde se abre un archivo de registro, pero en la pantalla se muestra el formato fácil de usar en lugar del archivo sin formato.

EDIT: Por lo tanto, no puedo elegir la mejor respuesta, y eso fue para elegir un idioma que pueda mostrar mejor lo que estoy buscando, y luego escribir el analizador en eso. Además, el uso de ANTLR probablemente hará que este proceso sea mucho más fácil. Cambié la pregunta original, ya que supongo que no pregunté qué estaba buscando realmente. ¡Gracias a todos!

+1

Necesitaríamos un poco más de información para poder ayudarlo. Alguna muestra de registro sería agradable, así como también cómo le gustaría que se analizara. –

+0

En cuanto a cómo quiero analizarlo, básicamente lo describí en mi edición anterior. En cuanto al archivo de registro en sí, no necesito ayuda con el análisis, solo al elegir la mejor herramienta para hacerlo. – HenryAdamsJr

+2

Probablemente también deba elegir un idioma en el que mostrar el texto de la forma que desee es fácil. La visualización puede ser más complicada que el análisis en sí. – meriton

Respuesta

14

Hmmm, "ve con lo que sabes" fue una buena respuesta. Perl fue diseñado para este tipo de cosas (pero imo es muy adecuado para el análisis simple, pero yo personalmente lo evitaría para proyectos complejos).

Si se vuelve un poco complejo, ¿por qué no utilizar una sintaxis y una configuración gramatical adecuadas?

Lex & Yacc (o Flex & bisonte) vienen a la mente, pero personalmente me gustaría llegar siempre a Antlr

Definir varias "palabras" en términos de patrones (sintaxis), y las reglas para combinar esas palabras (gramática) y Antlr escupirá un programa para analizar su entrada (puede tener el programa en Java, C, C++ y más (le preocupa el tiempo de análisis, así que elija un lenguaje compilado, por supuesto)).

personalmente encuentro analizadores tedioso para hacer a mano, y aún más tedioso para depurarlos, pero AntlrWorks es un IDE encantador, que realmente hace que sea un juego de niños ...

Que poco en la parte inferior es definiendo una regla gramatical

Si arruinas tus reglas de gramática, se te informará. Este no es el caso con los analizadores sintácticos hechos a mano, en los que solo rayará su body part y se preguntará acerca de los "resultados extraños" ...

Echa un vistazo. Incluso si crees que tu proyecto es trivial ahora, bien podría crecer. Y si tiene interés en el análisis, se debe a sí mismo al menos estar familiarizado con lex/yacc, pero especialmente Antlr (Works)

+1

Definitivamente voy a investigar esto. Parece que ANTLR sería extremadamente, sin importar el idioma que use. – HenryAdamsJr

7

Sugeriría usar Python o Perl. El análisis de archivos de texto grandes con expresiones regulares es realmente rápido.

2

Creo que perl se considera una buena opción para analizar el texto.

1

Perl es bueno para el procesamiento de texto.

Se han escrito varios programas de procesamiento de textos muy buenos en Perl. Ack (un reemplazo grep) es uno.

+0

voto a favor para qué? –

0

Suena como un trabajo para Perl, al igual que a mí particularmente no me importa como idioma. ActivePerl es una distribución razonable de Perl para Windows.

3

He usado Python y Perl. Perl es un ajuste más natural para esto, pero puede ser difícil de mantener. Python lo hará igual de bien y es más fácil de leer. Ir por Python.

+3

¡Pero todos los $ @% son tan hermosos! Ir por perl! – Cascabel

+2

@Jefromi - ¡Ja! No hay nada como volver a 200 líneas de sopa de símbolos meses después tratando de descubrir qué diablos estás pensando. =) –

+0

Agregué cierta información a la publicación para aclarar cómo voy a usar el texto analizado. Quiero tener una GUI que muestre el registro, pero en un formato amigable. No creo haber visto una aplicación de Windows GUI escrita usando Perl o Python, pero sé muy poco sobre ellos. – HenryAdamsJr

2

Tal vez un producto terminado como MS LogParser (usage podcast here) haga lo que necesite y es gratis.

+1

Definitivamente recomendaría buscar productos existentes gratuitos o comerciales para resolver el problema, sin necesidad de reinventar la rueda. Splunk es una popular herramienta de análisis y análisis de registros que puede aceptar entradas arbitrarias: http://www.splunk.com/base/Documentation/latest/Admin/WhatSplunkCanMonitor –

+1

También Apache ChainSaw. –

-2

c/C++ or java ... para C/C++ tengo fragmento que podría ayudarle a:

FILE *f = fopen(file, "rb"); 
if(f == NULL) { 
    return DBDEMON_OPEN_ERROR; // open fail 
} 

for(int i = 0; feof(f) == 0; i++) 

{ 

fscanf(f,"%d %s %s %c\n", &db[i].id, &db[i].name[0], &db[i].uid[0], &db[i].priviledge); 

db_size++; 

} 

fclose(f); 

esta es la lectura de un archivo con el siguiente formato:

cadena int char string

1 ALGO NADA Z

a una estructura definir de la siguiente manera:

typedef struct { 

    unsigned int id; 
    char  name[DBDEMON_NAME_MAXSIZE]; 
    char  uid[DBDEMON_UID_MAXSIZE]; 
    char  priviledge; 
} DATABASE; 

Use fscanf con cuidado, ya que no se verifican los tipos, etc., puede provocar errores. Pero creo que esto es bastante eficiente.

+0

amigo ... olvidó algunos espacios en algunas de esas líneas ... – SeanJA

+6

Soy un defensor de C/C++, e incluso no los llamaría idiomas geniales para el procesamiento de texto. –

+0

@Billy - Entonces, ¿C++ no procesa bien el texto? ¿Sería eso equilibrado por cómo puede crear fácilmente una GUI de Windows, o no? – HenryAdamsJr

9

Debe utilizar el idioma que USTED conoce ... A menos que tenga tanto tiempo disponible para completar el proyecto, también puede pasar el tiempo aprendiendo un nuevo idioma.

+1

Esta es SIEMPRE la respuesta correcta cuando la pregunta es "¿Qué idioma debo usar para hacer X?" Incluso si el idioma no es excelente para lo que estás haciendo, si no conoces uno mejor es mejor que te apegues a lo que sabes para proyectos serios. –

+1

Esa es una gran sugerencia, y si fuera necesario dentro de un cierto cronograma, estaría de acuerdo, pero iba a usar este proyecto como una excusa para aprender algo nuevo. Leer todas las respuestas hace que parezca que el lenguaje no lo hará más rápido o más lento en gran medida. Actualmente me inclino por C++ porque sé que puedo crear una GUI de Windows con él, y quiero agregarlo a mi repertorio. – HenryAdamsJr

4

Cualquiera que sea el idioma utilizado por su compañero de trabajo.

(podría decirte que cualquier ensamblador de macros te permitirá escribir código que desgarraría tus datos, pero en serio, ¿vas a pasar meses escribiendo ensamblajes solo para ahorrar unos segundos de tiempo de CPU? Volver a escribir un programa es divertido, pero no es practical.)

Agite su generador de perfiles, apúntelo a su analizador de registros que realiza horriblemente y resuelva los problemas de rendimiento. Si es un idioma común, habrá personas aquí que pueden ayudar.

+0

No ahorraría unos segundos. Si lo hago bien, literalmente ahorrará minutos. Con la implementación actual, si el archivo es lo suficientemente grande, no regresará. Siento que su implementación está mal desde cero, y de todos modos no tengo acceso al código fuente. – HenryAdamsJr

0

Sugeriría Perl. Fue construido prácticamente para analizar archivos de registro. En cuanto a la salida, estoy de acuerdo con ghostdog74, HTML es el camino a seguir. Perl tiene docenas de módulos que le permiten construir y/o crear plantillas HTML.

Analizaría los datos usando expresiones regulares, luego usaré Template :: Toolkit (en CPAN) para crear páginas agradables usando plantillas HTML y CSS.

2

Analice esta gran cantidad de texto en el menor tiempo posible.

Considere el PADS Project de AT & T. Es un lenguaje de propósito especial, compatible con C, eso es exactamente diseñado para el análisis de alta velocidad de archivos de registro hoc y otros formatos de datosde anuncios. Incluso hay una función en la que puede intentar aprender su formato de registro a partir de ejemplos, aunque no sé si eso ha llegado a la producción. Las personas detrás del proyecto son realmente inteligentes, y ha tenido un gran impacto dentro de la compañía telefónica. PADS ofrece un rendimiento muy alto en flujos de datos que producen gigabytes. Joe Bob dice que compruébalo.

Si "texto masivo en el tiempo más corto posible", Perl y Python no son la respuesta. Pero si necesitas acelerar algo no demasiado lento, y está bien tomar más tiempo, Perl y Python podrían estar bien. Tems de megabytes en realidad no es tan grande.

+0

Interesante tho. Convierte el código en una biblioteca C. – 3manuek

Cuestiones relacionadas