SevenZipSharp CompressStreamDictionary Ошибка
Потоки памяти размером менее 16 МБ работают хорошо. Но я получаю сообщение об ошибке (HResult = -2146233088) при сжатии потока памяти, размер которого превышает 16 МБ. Как я могу заставить его работать?
Я использую SevenZipSharp.dll Версия 0.64.3890.29348
SevenZip.SevenZipCompressor compressor = new SevenZip.SevenZipCompressor();
compressor.CompressionMethod = SevenZip.CompressionMethod.Lzma2;
compressor.CompressionLevel = SevenZip.CompressionLevel.Ultra;
compressor.EncryptHeaders = false;
using (Stream output = File.Open(sFileName, FileMode.Create))
{
ms.Position = 0;
compressor.CompressStreamDictionary(new Dictionary<string, Stream> { { zipFileName, ms } }, output, "");
}
Выполнение не удалось из-за ошибки в SevenZipSharp. Пожалуйста, сообщите об этом на http://sevenzipsharp.codeplex.com/WorkItem/List.aspx, опубликуйте номер релиза и приложите архив.
Stacktrace:
bei SevenZip.SevenZipBase.ThrowException (обработчик CallbackBase, Exception[] e). bei SevenZip.SevenZipBase.CheckedExecute(Int32 hresult, сообщение String, обработчик CallbackBase). frmConfigSystem.bwExport_DoWork(Отправитель объекта, DoWorkEventArgs e)
1 ответ
У меня была такая же проблема, и я решил ее так:
Загрузите ветку sevenzipsharp здесь: https://github.com/StevenBonePgh/SevenZipSharp Это последняя версия с множеством исправлений ошибок, но ошибка CompressStreamDictionary все еще существует (на сегодняшний день).
Чтобы исправить проблему с памятью, вы должны указать меньший размер словаря. Чем больше файл для сжатия, тем меньше размер файла. Это сделано так:
szc.CustomParameters.Add("d", 22);
Кажется, 26 является значением по умолчанию. Я сделал несколько тестов и сделал небольшую формулу, чтобы адаптировать размер словаря к размеру потока:
if (!Environment.Is64BitProcess)
{
if (stream.Length>=16*1024*1024)
{
int sizeG = (int)(stream.Length / 1024 / 1024 / 1024);
int param;
// from 16MB to 2GB: use 23
if (sizeG <= 2)
{
param = 23;
}
else
{
// from 2GB : use 24 - size(GB)
param = Math.Max(24 - sizeG, 1);
}
szc.CustomParameters.Add("d", param.ToString());
}
}
Я проверил это с файлами от 16 МБ до 8 ГБ без ошибок. Я передам код автору sevenzipsharp, чтобы включить его в исходный код.
Старый ответ:
Афайк, этот проект заброшен. У меня также есть некоторые ошибки при использовании его в многопоточной среде, и следующее решение, кажется, улучшит ситуацию:
Загрузите этот патч и применитесь к исходному коду SevenZipSharp. Это сделает его полностью многопоточным.
Вы также можете попробовать заменить библиотеку 7zip, поставляемую с пакетом sevenzipsharp, официальной библиотекой, которую можно загрузить по адресу http://www.7-zip.org/download.html
Примечание: вы найдете файл 7za.dll в скачанном архиве, это облегченная версия библиотеки, которая поддерживает только формат.7z (без zip...).