Pregunta

Hay algunos archivos de texto (Registros) a los que necesito acceder usando C # .Net. Pero el asunto es que esos archivos son más grandes que 1GB. (el tamaño mínimo es de 1 GB)

¿Qué debo hacer? ¿Cuáles son los factores en los que debo concentrarme?

¿Puede alguien darme una idea para salir de esta situación?

EDITAR:

Gracias por las respuestas rápidas. Sí, son registros de longitud fija. Estos archivos de texto provienen de una empresa local. (Hay registros de transacciones del mes pasado)

¿Es posible acceder a estos archivos como archivos de texto normales (usando una secuencia de archivos normal)?

y

¿Qué tal la gestión de memoria ????

¿Fue útil?

Solución

Ampliando la respuesta de CasperOne

En pocas palabras, no hay forma de poner de manera confiable un archivo de 100GB en la memoria al mismo tiempo. En una máquina de 32 bits simplemente no hay suficiente espacio de direccionamiento. En una máquina de 64 bits, hay suficiente espacio de direccionamiento, pero durante el tiempo que llevaría realmente obtener el archivo en la memoria, su usuario habrá eliminado su proceso por frustración.

El truco es procesar el archivo de forma incremental. La clase base System.IO.Stream () está diseñada para procesar un flujo variable (y posiblemente infinito) en cantidades distintas. Tiene varios métodos de lectura que solo progresarán en una secuencia un número específico de bytes. Deberá utilizar estos métodos para dividir la transmisión.

No puedo dar más información porque su escenario no es lo suficientemente específico. ¿Puede darnos más detalles o los delimitadores de su registro o algunas líneas de muestra del archivo?

Update

Si son registros de longitud fija, System.IO.Stream funcionará bien. Incluso puede usar File.Open () para obtener acceso al objeto Stream subyacente. Stream.Read tiene una sobrecarga que solicita la cantidad de bytes que se leerán del archivo. Dado que son registros de longitud fija, esto debería funcionar bien para su escenario.

Siempre que no llame a ReadAllText () y en su lugar use los métodos Stream.Read () que toman matrices de bytes explícitas, la memoria no será un problema. La clase Stream subyacente se encargará de no poner todo el archivo en la memoria (por supuesto, a menos que se lo pida :)).

Otros consejos

No está enumerando específicamente los problemas que necesita superar. Un archivo puede tener 100 GB y no puede tener problemas para procesarlo.

Si tiene que procesar el archivo como un todo , entonces eso requerirá un poco de codificación creativa, pero si simplemente puede procesar secciones del archivo a la vez, entonces es relativamente fácil muévase a la ubicación en el archivo desde el que necesita comenzar, procese los datos que necesita procesar en fragmentos y luego cierre el archivo.

Más información aquí sin duda sería útil.

¿Cuáles son los principales problemas que tienes en este momento? Lo más importante para recordar es pensar en términos de flujos, es decir, mantener la cantidad mínima de datos en la memoria que pueda. LINQ es excelente para trabajar con secuencias (aunque hay algunas operaciones de almacenamiento en búfer que debe evitar, como OrderBy).

Por ejemplo, aquí es una forma de manejar un simple registros de un archivo grande de manera eficiente (tenga en cuenta el bloque iterador).

Para realizar múltiples agregados / análisis sobre datos grandes de archivos, considere Push LINQ en MiscUtil .

¿Puedes agregar más contexto a los problemas en los que estás pensando?

Ampliando la respuesta de JaredPar.

Si el archivo es un archivo binario (es decir, ints almacenados como 4 bytes, cadenas de longitud fija, etc.) puede usar la clase BinaryReader. Más fácil que extraer n bytes y luego intentar interrogarlo.

También tenga en cuenta que el método de lectura en System.IO.Stream es una operación sin bloqueo. Si solicita 100 bytes, puede devolver menos que eso, pero aún no ha llegado al final del archivo.

El método BinaryReader.ReadBytes se bloqueará hasta que lea el número solicitado de bytes, o Fin del archivo, lo que ocurra primero.

Buenos muchachos de colaboración :)

Hola chicos, me doy cuenta de que esta publicación no se ha tocado en mucho tiempo, pero solo quería publicar un sitio que tenga la solución a su problema.

http: //thedeveloperpage.wordpress.com/c-articles/using-file-streams-to-write-any-size-file-introduction/

¡Espero que ayude!

-CJ

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top