У меня есть много больших файлов gzip (приблизительно 10 МБ - 200 МБ), которые я скачал из ftp для распаковки.GZIP декомпрессии C# OutOfMemory
Итак, я попытался найти Google и найти решение для декомпрессии 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();
}
}
}
он хорошо работает для любых файлов ниже 50 МБ, но как только у меня есть ввод более 50 МБ, я получил исключение из памяти. Последняя позиция и длина памяти до исключения - 134217728. Я не думаю, что она имеет отношение к моей физической памяти, я понимаю, что у меня не может быть объекта более 2 ГБ, поскольку я использую 32-разрядную.
Мне также необходимо обработать данные после распаковки файлов. Я не уверен, что здесь лучше всего использовать поток памяти, но мне не нравится писать в файл, а затем снова читать файлы.
Мои вопросы
- почему я System.OutMemoryException?
- Что такое наилучшее возможное решение для распаковки файлов gzip и последующей обработки текста?
Вы загружаете все содержимое потока в память и возвращаете его как массив байтов. Что еще вы ожидаете * other *, чем исключение из памяти? Вы не должны загружать все это в память так: что вы в конечном итоге собираетесь делать с массивом? Напишите его в файл? Что бы вы ни предполагали, он должен быть основан на потоках, а не на массиве. –
ну .. Исключение происходит на memory.write и застревает там в 134217728 .. Я не знаком с управлением памятью, поэтому, пожалуйста, несите меня. Позже я сохраню все обработанные файлы в базе данных, файл внутри gzipped-файлов - файл csv –
Конечно, но ваш дизайн был бы лучше, если бы вы его обработали * пока * вы разархивируете его. Таким образом вам не нужно было бы выделять огромный кусок памяти для его обработки. (например, бросая ваш поток gzip непосредственно в 'StreamReader') –