Tengo muchos archivos grandes gzip (aproximadamente 10MB - 200MB) que descargué de ftp para descomprimir.descompresión GZIP C# OutOfMemory
Intenté buscar en Google y encontrar alguna solución para la descompresión de gzip.
static byte[] Decompress(byte[] gzip)
{
using (GZipStream stream = new GZipStream(new MemoryStream(gzip), CompressionMode.Decompress))
{
const int size = 4096;
byte[] buffer = new byte[size];
using (MemoryStream memory = new MemoryStream())
{
int count = 0;
do
{
count = stream.Read(buffer, 0, size);
if (count > 0)
{
memory.Write(buffer, 0, count);
}
}
while (count > 0);
return memory.ToArray();
}
}
}
que funciona bien para los archivos por debajo de 50 MB, pero una vez que tengo más de 50 MB de entrada que tiene el sistema de excepción de memoria. Última posición y la longitud de la memoria antes de la excepción es 134217728. No creo que tenga relación con mi memoria física, entiendo que no puedo tener objetos de más de 2GB ya que uso 32 bits.
También necesito procesar los datos después de descomprimir los archivos. No estoy seguro de si el flujo de memoria es el mejor enfoque aquí, pero realmente no me gusta escribir en el archivo y luego leer los archivos de nuevo.
Mis preguntas
- ¿Por qué me System.OutMemoryException?
- ¿cuál es la mejor solución posible para descomprimir archivos gzip y hacer algo de procesamiento de texto después?
Está cargando todo el contenido de la secuencia en la memoria y devolviéndola como una matriz de bytes. ¿Qué otra cosa esperarías * otra * excepción de una memoria insuficiente? No debería cargar todo en la memoria de esta manera: ¿qué pretende hacer con la matriz en última instancia? Escribir en un archivo? Lo que sea que intentes, debe estar basado en secuencias y no en una matriz. –
bien ... La excepción se produce en memory.write y se queda allí en 134217728 .. No estoy familiarizado con la administración de la memoria, así que por favor tengan paciencia conmigo. Más tarde guardaré todos los archivos procesados en la base de datos, el archivo dentro de los archivos comprimidos es el archivo csv –
Claro, pero su diseño sería mejor si lo procesara * mientras * lo está descomprimiendo. De esa manera no tendrías que asignar una gran cantidad de memoria para manejarlo. (por ejemplo, lanzando su flujo gzip directamente en un '' StreamReader'') –