2010-06-04 14 views
5

Tengo una aplicación que me han encargado limpiar después. La aplicación en sí es relativamente simple: ejecuta una consulta SQL, consume un servicio web y arroja los resultados a un archivo de registro. Mi trabajo es archivar los archivos en nuestro NAS después de que la aplicación termine con ellos. Bloquea los archivos exclusivamente hasta que termina con ellos, por lo que agrega un poco de complejidad. Tampoco puedo tocar la aplicación, solo los registros. De todos modos, mi aplicación es bastante simple:Retransmisor de flujo inverso

  1. Compruebe si el archivo se puede abrir (atrapar IOException) y márquelo como accesible en un bool [] si no se produce ninguna excepción.
  2. Pasando por la matriz de archivos marcados como verdaderos, lea cada línea del archivo en un StreamReader utilizando el método ReadLine. Debido a que la aplicación de vez en cuando falla y no termina, no puedo simplemente usar la IOException para decir si el archivo se ha completado. De hecho, tengo que analizar el texto.
  3. Si se encuentra el texto que indica la finalización, comprima el archivo, cargue el archivo archivado en el NAS y elimine el original.

Mi código funciona, solo requiere mucho tiempo (los archivos de registro tienen 500 MB cada uno). Mi opinión sobre la mejora implica comenzar mi búsqueda desde la parte inferior del archivo en lugar de desde la parte superior, pero StreamReader no es compatible con dicho método. No puedo usar el método ReadToEnd y luego leer en reversa porque eso arroja una excepción de falta de memoria. ¿Alguna idea de cómo podría acelerar el análisis del archivo de registro?

+0

sabes que analizar los archivos es la parte lenta? no comprimir, copiar al NAS, eliminar o intentar abrir el archivo (y posiblemente fallar) todas esas cosas suenan como si pudieran tomar un tiempo – luke

+0

Posible engaño: http://stackoverflow.com/questions/452902/how-to-read -a-text-file-reversely-with-iterator-in-c –

+1

Buena pregunta. Sí, definitivamente es el análisis la porción de la ejecución que consume mucho tiempo. Separé el código en funciones individuales y puse puntos de corte en cada una. La compresión toma entre 30 y 45 segundos, el análisis puede llevar más de dos horas. – monkeyninja

Respuesta

6

Supongo que busca un solo marcador al final del archivo para determinar si ha finalizado. Si es así, también supongo que el marcador es de una longitud conocida, por ejemplo, un byte único o una secuencia de 3 bytes, etc.

Si las suposiciones anteriores son correctas, puede abrir FileStream, Seek hasta el final del archivo menos la longitud esperada del marcador, lee los bytes y si el marcador está presente y completo, sabes que puedes procesar el archivo.

buscar hasta el final -3 bytes se pueden hacer con un código como el siguiente

// Seek -3 bytes starting from the end of the file 
fileStream.Seek(-3, SeekOrigin.End); 
+0

Buscar puede ser una operación más costosa que la lectura secuencial y hacer búsquedas múltiples puede ser bastante lento. – josephj1989

+0

Es algo que aún no he probado, así que vale la pena intentarlo. Intentaré implementar la búsqueda y veré si eso acelera las cosas o no. Gracias a todos. – monkeyninja

+3

@ josephj1989, ¿está diciendo que es más rápido leer un archivo de 500 MB línea por línea o en trozos amistosos con la memoria hasta el final de lo que es simplemente buscar directamente hasta el final? Y por qué busca múltiples, mi suposición declarada es que el marcador está al final del archivo, de modo que solo una búsqueda. –