Ho molti file gzip di grandi dimensioni (circa 10 MB - 200 MB) che ho scaricato da ftp per essere decompresso.decompressione GZIP C# OutOfMemory
Così ho provato a google e trovare qualche soluzione per la decompressione 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();
}
}
}
funziona bene per qualsiasi file inferiore a 50 MB ma una volta che ho inserito più di 50mb ho ottenuto l'eccezione di memoria di sistema esaurita. L'ultima posizione e la lunghezza della memoria prima dell'eccezione è 134217728. Non penso che abbia una relazione con la mia memoria fisica, capisco che non posso avere oggetti più di 2 GB poiché utilizzo 32 bit.
Ho anche bisogno di elaborare i dati dopo decomprimere i file. Non sono sicuro che il flusso di memoria sia l'approccio migliore qui, ma non mi piace scrivere sul file e poi leggere di nuovo i file.
Le mie domande
- perché ho ricevuto System.OutMemoryException?
- qual è la migliore soluzione possibile per decomprimere i file gzip e successivamente eseguire l'elaborazione del testo?
si carica l'intero contenuto del flusso in memoria e il ritorno come matrice di byte. Cos'altro ti aspetteresti * altro * rispetto a un'eccezione di memoria insufficiente? Non dovresti caricarlo tutto in memoria come questo - cosa intendi fare in definitiva con l'array? Scrivilo in un file? Qualunque cosa tu intenda, dovrebbe essere basata sul flusso e non basata su array. –
bene .. L'eccezione si verifica su memory.write e bloccato lì in 134217728 .. Non ho familiarità con la gestione della memoria, quindi per favore sopportare me. Più tardi salverò tutti i file elaborati nel database, il file all'interno dei file gzip è il file csv –
Sicuro, ma il tuo design sarebbe meglio se lo elaborassi * mentre * lo stai decomprimendo. In questo modo non dovresti allocare un enorme pezzo di memoria per gestirlo. (ad esempio, lanciando il tuo flusso gzip direttamente in uno 'StreamReader') –