На англоязычной версии сайта нашел метод, который мне очень подходит:
public static byte[] Decompress(byte[] gzip)
{
using (var stream = new Ionic.Zlib.ZlibStream(new MemoryStream(gzip), Ionic.Zlib.CompressionMode.Decompress))
{
const int size = 1024;
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();
}
}
}
Для вызова метода пользуюсь
private void converttotarTool_Click(object sender, EventArgs e)
{
byte[] app = Decompress(File.ReadAllBytes(@"D:\ab\2017-01-03_141454.ab"));
File.WriteAllBytes(@"D:\ab\backup.tar", app);
}
Если конвертировать в ".tar" бекапы небольшого размера, то проблем не возникает. В моем случае бекап 1,6 гб - возникает ошибка outofmemory. Подскажите, как исправить метод чтобы все содержимое закидывалось в оперативную память частями?
Навряд ли поможет, но стоит попробовать сразу в файл записывать сжатые куски.
ZlibStream можно инициализировать любым стримом, так что не обязательно весь файл в памяти держать, а только куски по 1024, как у Вас и было, и записывать сжатый результат сразу в выходной файл:
public static void Decompress(string input, string output)
{
using (var stream = new Ionic.Zlib.ZlibStream(File.OpenRead(input), Ionic.Zlib.CompressionMode.Decompress))
{
const int size = 1024;
byte[] buffer = new byte[size];
using (FileStream file = File.Create(output))
{
int count = 0;
do
{
count = stream.Read(buffer, 0, size);
if (count > 0)
file.Write(buffer, 0, count);
} while (count > 0);
}
}
}
В дополнение к правильному ответу @Umed: вы не должны проводить ваши операции в памяти. У вас информация содержится в нескольких местах: она читается из файла в массив вся, потом из массива делается MemoryStream
, который содержит копию информации, потом другой MemoryStream
содержит декомпрессированную информацию, потом массив содержит копию декомпрессированной информации, и это всё сбрасывается в файл. Для «поточных» операций по кускам имеет смысл, как правильно написано в другом ответе, использовать именно потоки.
Результирующий код может быть таким (упростил пример @Umed):
public static void Decompress(string input, string output)
{
using (FileStream inputStream = File.OpenRead(input))
using (var zlibStream = new Ionic.Zlib.ZlibStream(inputStream,
Ionic.Zlib.CompressionMode.Decompress))
using (FileStream outputStream = File.Create(output))
zlibStream.CopyTo(outputStream);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Знатоки, может у Вас есть идеи, как реализовать это?
Форма WaitingDialogcs не прогружается, но когда метод GetPage законьчил работу загрузалиась
приветподскажите как загрузить картинку в базу MySQL
Если тхт1 имеет строку 57, и в тхт2 есть строки от 00 до 09(01, 02, 03, 04,(запятая как энтер) итдто софт должен считать каждую строку , хешарнуть ее и сравнить...