usar una txt texto leer importar hacer ejemplo datos como archivos archivo c# import datatable streamreader bulk

c# - txt - Una salida para obtener SystemOutOfMemoryException al importar desde un archivo de texto grande a la base de datos



select a archivo de texto (1)

Si entiendo correctamente, está cargando cada línea en una tabla que llega a ser tan grande como para alcanzar los límites de la memoria de su sistema.
Si es así, deberías encontrar este límite. (Por ejemplo 1000000 líneas). Deje de leer las líneas mucho antes de este punto y escriba las filas cargadas hasta el momento con OracleBulkCopy. Limpia tu memoria y comienza de nuevo. Así que déjame resumir todo con un pseudocódigo.

int lineLimit = GetConfiguration("lineLimit"); int lineNumber = 0; DataTable logZyWall = CreateLogTable(); using(StreamReader reader=new StreamReader("C:/ZyWall.log")) { while ((line=reader.ReadLine())!=null) { DataRow row = ParseThisLine(line); logZyWall.Rows.Add(row); lineNumber++; if(lineNumber == lineLimit) { WriteWithOracleBulkCopy(logZyWall); logZyWall = CreateLogTable(); lineNumber = 0; } } if(lineNumber != 0) WriteWithOracleBulkCopy(logZyWall); }

estamos usando ZyWall para proteger nuestros servidores de intrusiones externas. Genera archivos de registro diarios con tamaños enormes, más de un GB, a veces 2 GB. Usualmente contienen más de 10 millones de líneas. Ahora mi tarea es escribir una aplicación que importará estas líneas en la base de datos Oracle. Lo estoy escribiendo en C #. Lo que estoy haciendo actualmente es:

  1. Leo los archivos de registro línea por línea. No cargo todo el archivo de una vez:

    using (StreamReader reader = new StreamReader ("C: / ZyWall.log")) {while ((line = reader.ReadLine ())! = null) ......}

  2. En cada línea leída, divido la línea en partes de acuerdo con las comas que contiene.

    string [] lines = line.Split (nuevo Char [] {'',''}, 10);

  3. Luego, repito a través de la matriz de líneas, creo una nueva Fila para un objeto DataTable predefinido y asigno valores de matriz a las columnas de la fila. Luego agrego la fila a la tabla de datos.

Después de leer todas las líneas en la tabla de datos, uso OracleBulkCopy para escribir los datos en una tabla física en la base de datos con la misma estructura. Pero el problema es que obtengo SystemOutOfMemoryException cuando agrego las líneas al objeto Datatable, que es el tercer paso. Si comento el tercer paso, en el administrador de tareas veo que la aplicación consume la cantidad estable de memoria que es algo así como 17000 K, pero si descomenta ese paso, el uso de la memoria aumenta a menos que no haya suficiente memoria para asignar. ¿Todavía hay una manera en que puedo usar BulkCopy para realizar esto o tendré que hacerlo manualmente? Utilicé BulkCopy porque es mucho más rápido que insertar líneas una por una.