Ionic zip выдает исключение из памяти

Я использую ionic zip (версия-1.9.1.8) для сжатия некоторых файлов. Обычно у меня есть большие файлы размером от 2 до 3 ГБ ... этот ionic zip отлично работает в моей системе, но пока я использую его на другом пользовательском компьютере (НА САЙТЕ )... этот ионный почтовый индекс выдает следующее исключение. Конфигурация обеих систем одинакова.

Exception details:
******************
[6/11/2012 01:21:38:812]
 System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.
   at Ionic.Zip.ZipEntry._WriteEntryData(Stream s)
   at Ionic.Zip.ZipEntry.Write(Stream s)
   at Ionic.Zip.ZipFile.Save()
   at Ionic.Zip.ZipFile.Save(String fileName)
   at MyCode.SaveZipFile()

[6/11/2012 01:21:38:828]

System.NullReferenceException: Object reference not set to an instance of an object.
   at Ionic.Zlib.ParallelDeflateOutputStream._Flush(Boolean lastInput)
   at Ionic.Zlib.ParallelDeflateOutputStream.Close()
   at Ionic.Zlib.ParallelDeflateOutputStream.Dispose()
   at Ionic.Zip.ZipFile.Dispose(Boolean disposeManagedResources)
   at Ionic.Zip.ZipFile.Dispose()
   at Mycode.SaveZipFile()
   at Mycode.SaveLogs()

Может ли кто-нибудь помочь мне найти причину таких проблем..??

заранее спасибо


person Techy    schedule 11.06.2012    source источник
comment
Добавить больше памяти? :) 'System.OutOfMemoryException' довольно серьезно. Так что вам нужно либо избегать его, либо использовать другой, более эффективный, zip-декодер вместо iconic.zip. Как насчет SharpDevlops Zip?   -  person Gone Coding    schedule 11.06.2012
comment
Я не могу позволить себе использовать другой zip-инструмент ... Что-то должно быть там, чтобы исправить эту проблему, так как я не сталкиваюсь с этой проблемой памяти в моей системе ..   -  person Techy    schedule 11.06.2012
comment
Глупый вопрос: у вашей системы больше памяти, чем у той, которая дает сбой?   -  person Gone Coding    schedule 11.06.2012
comment
Конфигурация не обязательно означает память. Может быть, я предлагаю вам быть немного вежливее, когда просите всех остальных решить ваши проблемы... :) Теперь я воспользуюсь своим советом в другом месте.   -  person Gone Coding    schedule 11.06.2012


Ответы (1)


Вам нужно показать код. Если ваше приложение заархивировано в поток памяти, оно будет подвержено нехватке памяти. Это будет проблемой в вашем приложении, а не в библиотеке.

Кроме того, из трассировки стека я вижу, что он использует параллельный дефлятор. Это обменивает время выполнения на память. ЕСЛИ у вас есть проблемы с памятью, вы можете отключить параллельное сжатие и использовать гораздо меньше памяти.

Сделайте это примерно так в своем коде:

 zip.ParallelDeflateThreshold = -1;

также см. документацию по этой функции: http://cheeso.members.winisp.net/DotNetZipHelp/html/0988edb5-1d59-2875-8e77-ad195601cbce.htm

person Cheeso    schedule 13.06.2012
comment
Спасибо, cheeso.. я понимаю использование ParallelDeflateThreshold.. В предоставленной вами ссылке указано, что значение по умолчанию для этого свойства равно -1, что означает, что параллельное сжатие не будет выполняться, если вы не установите его равным нулю. Так что я должен установить это свойство на ноль и проверить его. Также какой метод сжатия по умолчанию используется ionic zip... - person Techy; 15.06.2012
comment
Сжатие по умолчанию — DEFLATE. Попробуйте с порогом, явно установленным на -1. Не уверен, что это на самом деле значение по умолчанию. Попробуйте и посмотрите. - person Cheeso; 15.06.2012
comment
я установил порог на -1, и тогда я тоже получил исключение, единственная разница в том, что это исключение происходит через некоторое время ... я читал в другой статье об использовании zipoutputstream ... должен ли я использовать это вместо этого класса zipfile.. и отметить, что я пытаюсь заархивировать файлы размером более 2 ГБ - person Techy; 15.06.2012
comment
Ну, я не знаю, как выглядит ваш код, поэтому трудно сказать. Библиотеку можно использовать таким образом, что это приведет к ошибке нехватки памяти, и простая оптимизация использования позволит избежать этой проблемы. Но я не могу сказать, так ли это, потому что я не видел вашего кода. Переключение на ZipOutputStream не будет использовать значительно меньше памяти для правильно структурированного кода. Вы должны использовать класс, который вам наиболее удобен. При потоковой передаче вы, возможно, подумаете, что zipoutputstream является более естественным выбором. - person Cheeso; 15.06.2012
comment
Спасибо за ваше время. У меня здесь огромный код, поэтому я только что добавил область zip-файла в свой проект. Вот как это происходит.. this._zip.AddEntry(archieveDir, streamReader.ReadToEnd()); this._zip.AddEntry(archiveDir, FileStream); this._zip.Сохранить (this._zipFilePath); -›Это вызывает исключение..И обратите внимание, что файловый поток содержит большое количество файлов размером более 1,5 ГБ. - person Techy; 15.06.2012
comment
Если бы мне пришлось угадывать, я бы предположил, что в вашем коде есть некоторые возможности для улучшения. Но я не могу сказать наверняка. Вам нужно будет опубликовать фактическую трассировку стека, которую вы получаете, и ваш фактический код. 3 строки псевдокода не помогут поставить диагноз. - person Cheeso; 15.06.2012