Dotnetzip - чтение на память -- c# поле с участием dotnetzip пол Связанный проблема

DotNetZip - reading to memory


2
vote

проблема

русский

Я собрал быстрый тест, используя библиотеку Dotnetzip, которая открывает ZIP-файл, полный файлов .bmp и преобразует их в формат .jpg.

До этого я писал все файлы в папку, конвертируя их, сэкономьте файлы jpg и AMP; Затем удалив оригинальные файлы BMP, которые получили грязные.

Я не хочу расстегнуть их в память первым, преобразовать в JPG & AMP; Тогда сохраните.

Код работает, но просто не так быстро. Может кто-нибудь дать мне какие-либо указатели относительно того, что я могу сделать, чтобы улучшить код, пожалуйста? Кроме того, поток помощи?

 <код> 5.5.15  

Спасибо

Английский оригинал

I've put together a quick test using the DotNetZip library which opens a zip file full of .bmp files and converts them to .jpg format.

Prior to this I was writing all of the files to a folder, converting them, saving out the jpg files & then removing the original bmp files, which got messy.

I'm no looking to unzip them in memory first, convert to jpg & then save.

The code works, but just isn't that quick. Can anyone give me any pointers as to what I can do to improve the code please? Also, Would threading help?

string zipToUnpack = "c:\test\1000.zip"; string unpackDirectory = "c:\temp\";  string f = string.Empty; Bitmap bm; MemoryStream ms;  using (ZipFile zip = ZipFile.Read(zipToUnpack)) {                    foreach (ZipEntry e in zip)   {     if (e.FileName.ToLower().IndexOf(".bmp") > 0)     {       ms = new MemoryStream();       e.Extract(ms);       try       {         bm = new Bitmap(ms);                                       f = unpackDirectory + e.FileName.ToLower().Replace(".bmp", ".jpg");         bm.Save(f, System.Drawing.Imaging.ImageFormat.Jpeg);       }       catch (Exception ex)       {         Console.WriteLine("File: " + e.FileName + " " + ex.ToString());       }       ms.Dispose();     }   } } 

Thanks

</div
     
       
       

Список ответов

3
 
vote
vote
Лучший ответ
 

В общем, dotnetzip - однопоточная. Вы можете открыть несколько архивов в нескольких потоках, но каждый архив только в одном потоке.

Если вы хотите заручиться несколькими процессорами или сердечниками, то я могу предложить вызов QueueuserWorkeTem для части, где вы преобразуете данные в MemoryStream в JPG.

Вызов zipentry.extract () должен быть выполнен в том же потоке для всех записей. Это связано с тем, что ZIPFile поддерживает один FILEStream для всех доступа к чтению, и вторых записей извлечения нескольких потоков приведет к арифметическим ошибкам указателя файлов.

Так, что-то вроде этого:

 <код>     public class State     {         public string FileName;         public MemoryStream stream;     }      public void Run()     {         string unpackDirectory = "c:\temp\";         string zipToUnpack = "c:\test\1000.zip";          var ConvertImage = new WaitCallback( (o) => {                 State s = o as State;                 try                 {                     var bm = new Bitmap(s.stream);                     var f = unpackDirectory + s.FileName.ToLower().Replace(".bmp", ".jpg");                     bm.Save(f, System.Drawing.Imaging.ImageFormat.Jpeg);                 }                 catch (Exception ex)                 {                     Console.WriteLine("File: " + s.FileName + " " + ex.ToString());                 }             });           using (ZipFile zip = ZipFile.Read(zipToUnpack))         {             foreach (ZipEntry e in zip)             {                 if (e.FileName.ToLower().IndexOf(".bmp") > 0)                 {                     var ms = new MemoryStream();                     e.Extract(ms);                     ThreadPool.QueueUserWorkItem ( ConvertImage,                                                     new State {                                                        FileName = e.FileName, stream = ms }                                                    });                                       }             }         }     }   
 

In general, DotNetZip is single-threaded. You can open multiple archives in multiple threads, but each archive in only one thread.

If you want to enlist multiple CPUs or cores, then I can suggest calling QueueUserWorkItem for the part where you convert the data in the MemoryStream into a jpg.

The call to ZipEntry.Extract() needs to be done on the same thread, for all entries. This is because the Zipfile maintains a single FileStream for all read access, and multiple threads extracting entries will cause file pointer arithmetic errors.

So, something like this:

    public class State     {         public string FileName;         public MemoryStream stream;     }      public void Run()     {         string unpackDirectory = "c:\temp\";         string zipToUnpack = "c:\test\1000.zip";          var ConvertImage = new WaitCallback( (o) => {                 State s = o as State;                 try                 {                     var bm = new Bitmap(s.stream);                     var f = unpackDirectory + s.FileName.ToLower().Replace(".bmp", ".jpg");                     bm.Save(f, System.Drawing.Imaging.ImageFormat.Jpeg);                 }                 catch (Exception ex)                 {                     Console.WriteLine("File: " + s.FileName + " " + ex.ToString());                 }             });           using (ZipFile zip = ZipFile.Read(zipToUnpack))         {             foreach (ZipEntry e in zip)             {                 if (e.FileName.ToLower().IndexOf(".bmp") > 0)                 {                     var ms = new MemoryStream();                     e.Extract(ms);                     ThreadPool.QueueUserWorkItem ( ConvertImage,                                                     new State {                                                        FileName = e.FileName, stream = ms }                                                    });                                       }             }         }     } 
</div
 
 

Связанный проблема

1  C # код для объемного обновления SQL Server  ( C sharp code to bulk update sql server ) 
У нас есть этот код C #, который будет обновлять таблицу базы данных SQL Server на основе флагов в структуре. <код> public struct stSRK { public string...

0  Как использовать запрос LINQ для обновления базовой таблицы базы данных  ( How do i use a linq query to update the underlying database table ) 
Я использую сильно напечатанный набор данных, и я покажу свой псевдо-код ниже. То, что я пытаюсь сделать, это только выбрать только одно значение столбца из б...

156  Найдите, если текущее время падает в диапазоне времени  ( Find if current time falls in a time range ) 
Использование .NET 3.5 Я хочу определить, падает ли текущее время в диапазоне времени. до сих пор у меня есть текущее время: <код> DateTime currentTime ...

1  Фильтр Combobox Ecenterource для отображения активных значений только плюс текущее выбранное значение  ( Filter combobox itemsource to display active values only plus the currently sele ) 
У меня есть пользовательский коммунальный контроль, используемый во всем приложении. Я хочу, чтобы элементыSource отображают только активные элементы, а в тек...

770  Файл метаданных '.dll' не может быть найден  ( Metadata file dll could not be found ) 
Я работаю над проектом WPF, C # 3.0, и я получаю эту ошибку: <код> Error 1 Metadata file 'WORK=- ToolsVersionManagementSystemBusinessLogicLayerinDebug Busi...

1  N Установление алфавитного заказа  ( N unit alphabetical order assertion ) 
У меня есть поле поиска на веб-сайте, который возвращает результаты поиска, на основе ключевого слова (хранение их в виде списка в C #) Есть параметры фильт...

249  Для чего используется «Динамический» тип в C # 4.0 для?  ( What is the dynamic type in c sharp 4 0 used for ) 
C # 4.0 представил новый тип под названием «Dynamic». Все это звучит хорошо, но что бы программист использовать это для? Есть ситуация, когда она может спас...

10  EF Core и большой трафик приводит к максимальному размеру пула  ( Ef core and big traffic leads to max pool size was reached error ) 
Мы используем Core Asp.net Entity Framework Core для запроса нашей базы данных MSSQL в нашем приложении Web API. Иногда, когда у нас есть большой трафик, запр...

1  Как изменить координаты текста на странице PDF из нижнего левого слева  ( How to change the coordinates of a text in a pdf page from lower left to upper l ) 
Я использую pdfbox и itextsharp dll и обработаю PDF. Так что я получаю текстовые координаты текста в прямоугольнике. Координаты прямоугольника извлекаются с п...

20  Как придумать имена более четких интерфейсов?  ( How to come up with clearer interface names ) 
Я видел в приложении, где он имел интерфейсы, такие как: <код> IHasContent IHasValue IHasMesh IHasGeometry IHasTransformation Если они не будут?: <код...

1  Как иметь класс, используйте Getter / Setter по умолчанию при упоминании непосредственно в C #?  ( How to have a class use a default getter setter when referenced directly in c ) 
Допустим, у меня есть класс, как <код> class SecretInt { private int secret = 1; } Как я могу сделать это так, чтобы. <код> SecretInt a = new Secr...

2  Рекурсивно поисковые каталоги в C #  ( Recursively search directories in c sharp ) 
Мне нужно рекурсивно пересекать каталоги в C #. Я делаю что-то вроде Это . Но это выбрасывает исключение при итерации через системные папки. Как проверить эт...

-2  Рассчитать номера диапазона IP из 2 заданных IP-адресов [Закрыто]  ( Calculate ip range numbers from 2 given ip addresses ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> <Путь d = "M15 6.38A6.48 6.48 0 007.78. 04H-.02A6.49 6.49 0 002.05 ...

2  Компиляция страницы ASPX не удается  ( Aspx page compilation fails ) 
Мы разрабатываем веб-приложение, которое позволяет администраторам загружать плагины. Все плагины хранятся в специальной папке вне корня приложения (скажем, C...

-1  Ошибка - RaceOnrcwleanean был обнаружен во время параллельного метода Parallel.invoke  ( Error raceonrcwcleanup was detected during parallel invoke method ) 
Я пытаюсь экспортировать все листы файла Excel, используя следующую часть кода. Я звоню один метод, используя разные значения параметров. Это дает мне после...

Связанный проблема

1  C # код для объемного обновления SQL Server 
0  Как использовать запрос LINQ для обновления базовой таблицы базы данных 
156  Найдите, если текущее время падает в диапазоне времени 
1  Фильтр Combobox Ecenterource для отображения активных значений только плюс текущее выбранное значение 
770  Файл метаданных '.dll' не может быть найден 
1  N Установление алфавитного заказа 
249  Для чего используется «Динамический» тип в C # 4.0 для? 
10  EF Core и большой трафик приводит к максимальному размеру пула 
1  Как изменить координаты текста на странице PDF из нижнего левого слева 
20  Как придумать имена более четких интерфейсов? 
1  Как иметь класс, используйте Getter / Setter по умолчанию при упоминании непосредственно в C #? 
2  Рекурсивно поисковые каталоги в C # 
-2  Рассчитать номера диапазона IP из 2 заданных IP-адресов [Закрыто] 
2  Компиляция страницы ASPX не удается 
-1  Ошибка - RaceOnrcwleanean был обнаружен во время параллельного метода Parallel.invoke