. Net: Распаковка файла Gz: недостаточно памяти для продолжения выполнения программы - PullRequest
0 голосов
/ 05 мая 2020

Итак, я использовал метод ниже, чтобы распаковать файлы .gz, и он работал очень хорошо.

Используется SharpZip.

Теперь я использую файлы большего размера и, кажется, пытаюсь распаковать все в памяти, что дает мне: Недостаточно памяти для продолжения выполнения программы ..

Должен ли я вместо этого читать каждую строку использования ReadToEnd ()?

public static void DecompressGZip(String fileRoot, String destRoot)
        {
            using FileStream fileStram = new FileStream(fileRoot, FileMode.Open, FileAccess.Read);
            using GZipInputStream zipStream = new GZipInputStream(fileStram);
            using StreamReader sr = new StreamReader(zipStream);
            var data = sr.ReadToEnd();
            File.WriteAllText(destRoot, data);
        }

1 Ответ

2 голосов
/ 05 мая 2020

Как предлагает @ alexei-levenkov, CopyTo разбивает копию на части, не используя всю память.

Бонусные баллы, используйте версию Asyn c для улучшения потоковой передачи.

public static async Task DecompressGZipAsync(String fileRoot, String destRoot)
{
      using (Stream zipFileStream = File.OpenRead(fileRoot))
      using (Stream outputFileStream = File.Create(destRoot))
      using (Stream zipStream = new GZipInputStream(zipFileStream))
      {
            await zipStream.CopyToAsync(outputFileStream);
      }
}
...