2012-04-27 32 views
6

Necesito analizar un gran archivo CSV en tiempo real, mientras está siendo modificado (adjunto) por un proceso diferente. En general, me refiero a ~ 20 GB en este punto, y de crecimiento lento. La aplicación solo necesita detectar e informar ciertas anomalías en el flujo de datos, para lo cual solo necesita almacenar información de estado pequeño (O(1) espacio).Analizando archivos de texto grandes, modificados sobre la marcha

Estaba pensando en sondear los atributos del archivo (tamaño) cada dos segundos, abriendo un flujo de solo lectura, buscando la posición anterior, y luego continuando el análisis donde primero me detuve. Pero dado que este es un archivo de texto (CSV), obviamente necesito hacer un seguimiento de los caracteres de la nueva línea cuando continúo de alguna manera, para asegurarme de que siempre analizo una línea completa.

Si no me equivoco, esto no debería ser un problema para implementar, pero quería saber si hay una forma/biblioteca común que resuelva algunos de estos problemas.

Nota: No necesito un analizador CSV. Necesito información sobre una biblioteca que simplifica la lectura de líneas de un archivo que se modifica sobre la marcha.

+0

¿Es posible detener el procesamiento de csv? En caso afirmativo, te sugiero que lo transfieras a RDBMS. – Oybek

+0

@Oybek: ¿puedes aclarar eso un poco? El proceso que se agrega al archivo se está ejecutando constantemente, y necesito analizar los datos línea por línea constantemente (con varios segundos de retraso). – Groo

+0

Supongo que no tiene control del proceso que emite el archivo? –

Respuesta

1

Hay un pequeño problema aquí:

  • leer y analizar CSV requiere un TextReader
  • posicionamiento no funciona (bien) con TextReaders.

Pensamiento inicial: Mantenerlo abierto. Si ambos el productor y el analizador funcionan en modo no exclusivo Debería ser posible ReadLine-hasta-null, hacer una pausa, ReadLine-hasta-null, etc.


que debería ser de 7 bits ASCII , solo algunos GUID y números

Eso hace que sea factible para rastrear el archivo de posición (POS + = line.Length + 2). Asegúrese de abrirlo con . Luego puede volver a abrirlo como un flujo binario simple, buscar hasta la última posición y solo luego adjuntar un StreamReader a esa transmisión.

+0

Tienes razón, eso es probablemente mucho mejor que buscar. – Groo

+0

Mierda, ni siquiera consideré caracteres de varios bytes hasta que lo mencionaste. Otro gran consejo, gracias! – Groo

0

¿Por qué no acaba de derivar un proceso/hilo por separado cada vez que comienza a analizar - de esa manera, mueve la parte concurrente (sobre la marcha) desde la fuente de datos hacia su receptor de datos, por lo ahora sólo hay que encontrar la manera de recoger los resultados de todos los hilos ...

Esto se significar hacer una de nueva lectura de todo el archivo para cada hilo se gira hacia arriba, aunque ...

Podría ejecutar un programa diff en las dos versiones y continuar desde allí, dependiendo de qué tan bien formada sea la fuente de datos csv: ¿modifica los registros ya escritos? ¿O solo agrega nuevos registros?Si es así, sólo puede escindir el nuevo material (última posición a la corriente-EF) en un nuevo archivo, y procesar los libre en un subproceso de fondo:

  • subproceso de sondeo recuerda el tamaño último archivo
  • cuando el archivo se hace más grande: buscar desde la última posición hasta el final, guardar en archivo temporal
  • subproceso de fondo procesa los archivos temporales que aún quedan, en el orden de la creación/modificación
+1

Bueno, el tamaño de los datos que se agregan cada segundo es relativamente pequeño en comparación con el tamaño completo del archivo, y es por eso que me gustaría evitar leerlo todo el tiempo (puede ser fácilmente de 50 GB después de una semana de mediciones). Y dado que los datos solo se anexan y los archivos son muy grandes, diff no es práctico. Tampoco entiendo la parte sobre el enhebrado: dado que se trata de una operación de disco, la lectura no se beneficiará de múltiples hilos, solo puede ejecutar la IMO más lenta y el paso donde escribo el archivo parcial en el disco y luego lo vuelvo a abrir también parece redundante (si lo estoy copiando, también puedo analizarlo). – Groo

2

no he probado, pero lo que pienso puede usar un FileSystemWatcher para detectar cuando un proceso diferente modificó su archivo. En el evento Modificado, podrá buscar un puesto que haya guardado anteriormente y leer el contenido adicional.

Cuestiones relacionadas