Tôi có nhiều tệp gzip lớn (khoảng 10MB - 200MB) mà tôi đã tải xuống từ ftp để được giải nén.Giải nén GZIP C# OutOfMemory
Vì vậy, tôi đã cố gắng tìm kiếm một số giải pháp để giải nén 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();
}
}
}
nó hoạt động tốt cho bất kỳ tệp nào dưới 50mb nhưng một khi tôi đã nhập hơn 50mb, tôi có hệ thống hết ngoại lệ bộ nhớ. Vị trí cuối cùng và độ dài của bộ nhớ trước khi ngoại lệ là 134217728. Tôi không nghĩ rằng nó có quan hệ với bộ nhớ vật lý của tôi, tôi hiểu rằng tôi không thể có đối tượng nhiều hơn 2GB kể từ khi tôi sử dụng 32-bit.
Tôi cũng cần xử lý dữ liệu sau khi giải nén các tệp. Tôi không chắc chắn nếu dòng bộ nhớ là cách tiếp cận tốt nhất ở đây nhưng tôi không thực sự thích viết vào tập tin và sau đó đọc các tập tin một lần nữa.
Câu hỏi của tôi
- tại sao tôi nhận được System.OutMemoryException?
- giải pháp tốt nhất có thể để giải nén các tệp gzip và thực hiện một số xử lý văn bản sau đó là gì?
Bạn đang tải toàn bộ nội dung của luồng vào bộ nhớ và trả về dưới dạng mảng byte. Bạn sẽ mong đợi điều gì khác * khác * hơn một ngoại lệ bộ nhớ? Bạn không nên tải tất cả vào bộ nhớ như thế này - cuối cùng bạn định làm gì với mảng? Viết nó vào một tập tin? Dù bạn có ý định gì, nó cũng phải dựa trên luồng chứ không phải dựa trên mảng. –
cũng .. Ngoại lệ xảy ra trên memory.write và bị kẹt ở đó trong 134217728 .. Tôi không quen thuộc với quản lý bộ nhớ, vì vậy hãy chịu với tôi. Sau đó tôi sẽ lưu tất cả các tệp đã xử lý vào cơ sở dữ liệu, tệp bên trong tệp được nén là tệp csv –
Chắc chắn, nhưng thiết kế của bạn sẽ tốt hơn nếu bạn xử lý tệp * trong khi * bạn đang giải nén. Bằng cách đó bạn sẽ không phải phân bổ một bộ nhớ khổng lồ để xử lý nó. (ví dụ, bằng cách ném luồng gzip của bạn trực tiếp vào một 'StreamReader') –