Самый быстрый способ распаковать БОЛЬШОЙ .tar.gz в C#?

У меня есть множество файлов .tar.gz размером около 5 ГБ. Я заметил, что .NET GZipStream на самом деле застревает в бесконечном цикле, пытаясь распаковать их.

Я нашел чистый код C#, но у всех были проблемы с размером моих файлов. В отличие от других плакатов (24GB tar.gz Распаковка с использованием Sharpziplib), я компилирую приложение как 64-битное приложение .NET 4.5.1 на 64-битной машине.

Я заметил, что .NET 4.5.1 снимает ограничение в 2 ГБ ... но после прочтения обнаружил, что это вводит в заблуждение, похоже, что на самом деле он удаляет все вложенные части объекта, не имея возможности использовать более 2 ГБ, но фактически адресуемый диапазон для таких объектов, как массивы байтов, по-прежнему кажется 2 ГБ даже с включена соответствующая опция

Есть ли у кого-нибудь какие-либо решения или я столкнулся с ограничением в С#? Я могу вызвать 64-битную 7ZIP DLL из своего приложения или вызвать 7ZIP .exe и дождаться его завершения (что-то вроде бреда), но должен ли быть более чистый способ? Также мне нужна самая быстрая распаковка и желательно что-то в чистом коде С#, но в настоящее время я думаю, что это невозможно в С# (из-за ограничений адресного диапазона массивов байтов)


person Matthew1471    schedule 08.04.2014    source источник


Ответы (1)


Вы не сможете загрузить полученные данные в один byte[] в C#. Вы по-прежнему будете ограничены размером массива.

Тем не менее, вы должны иметь возможность распаковывать их без проблем, просто используя потоки и распаковывая через поток. Мне очень повезло с DotNetZip и большими потоками — с его помощью вы сможете просто сделать:

using (System.IO.Stream input = System.IO.File.OpenRead(inputFile))
using (Stream decompressor= new Ionic.Zlib.GZipStream(input, CompressionMode.Decompress, true))
using (var output = System.IO.File.Create(outputFile))
    decompressor.CopyTo(output);
person Reed Copsey    schedule 08.04.2014