2011-03-10 2 views
2

나는 .bmp 파일로 가득 찬 zip 파일을 열고 .jpg 형식으로 변환하는 DotNetZip 라이브러리를 사용하여 빠른 테스트를 작성했습니다.DotNetZip - 메모리로 읽기

이전에는 jpg 파일을 저장하지 않고 모든 파일을 폴더로 작성했습니다 & 다음 지저분한 원본 bmp 파일을 제거하십시오.

메모리에서 먼저 압축을 풀고 jpg &으로 변환하고 저장하지 않으려 고합니다.

코드는 작동하지만 그다지 빠르지는 않습니다. 누구든지 코드를 개선하기 위해 내가 할 수있는 것에 관해서는 어떤 포인터를 주어도 될까요? 또한 스레딩 도움이 될까요?

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(); 
    } 
    } 
} 

감사 일반적으로

+1

느린 부분은 무엇입니까? http://www.dijksterhuis.org/timing-function-performance-stopwatch-class/이 사실을 알 수 있습니다. –

+0

초시계에 감사드립니다. 1 분 안에 1000 개의 이미지를 변환 중입니다. 나는 누군가가 전반적인 디자인을 개선하기위한 아이디어를 가지고 있는지 궁금했다. 나는 그것이 느린 부분 인 jpg 로의 변환이라고 확신한다. 스레딩이 도움이되는지 또는이 경우에도 적용 할 수 있는지 여부는 확실하지 않습니다. – StuffandBlah

+0

어떻게 스레딩을 적용할지 모르겠습니다. zip을 순차적으로 읽어야하므로 초기 솔루션을 사용하지 않고 먼저 압축을 풀고 변환하면 스레드간에로드를 나눌 수 없습니다. 그리고 심지어 스레딩은 CPU가 더 많은 일을하도록하는 것에 관한 것입니다. 하지만 하드 드라이브가 계속 작동하지 않는다면 스레딩은 아무 소용이 없습니다. –

답변

3

는 DotNetZip는 단일 스레드입니다. 여러 개의 아카이브에서 여러 아카이브를 열 수 있지만 각 아카이브는 하나의 스레드에서만 열 수 있습니다.

여러 개의 CPU 또는 코어를 등록하려는 경우 MemoryStream의 데이터를 jpg로 변환하는 부분에 대해 QueueUserWorkItem을 호출하는 것이 좋습니다.

모든 항목에 대해 동일한 스레드에서 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 } 
                });      
       } 
      } 
     } 
    } 
+0

Aw, shucks. 기꺼이 도와주세요. – Cheeso

관련 문제