2015-08-11 3 views
3

Мне нужно разделить многостраничные файлы TIFF. Входная папка содержит 100 файлов TIFF. Время, затрачиваемое на 100 файлов TIFF, составляет 1,40 минуты. Каждый файл TIFF содержит две страницы. Есть ли способ повысить производительность, и есть ли способ ускорить процесс?Выполнение разделения многостраничных TIFF

   static void Main(string[] args) 
      { 
        string input = @"D:\testSplit\input\"; 
       string output = @"D:\testSplit\output\out"; 
       DirectoryInfo dir1 = new DirectoryInfo(input);   
       FileInfo[] DispatchFiles = dir1.GetFiles(); 
       if (DispatchFiles.Length > 0) 
       { 
        foreach (FileInfo aFile in DispatchFiles) 
        { 
         string files = input + aFile.Name; 

         if (File.Exists(files)) 
         { 
          Split(files, output); 
         } 

        } 
       } 
      } 


      public static List<string> Split(string InputFilePath, string OutputPath) 
      { 
       List<string> splitFileNames = new List<string>(); 
       try 
       { 
        //Get the frame dimension list from the image of the file and 
         Image tiffImage = Image.FromFile(InputFilePath);        
        //get the globally unique identifier (GUID)   
        Guid objGuid = tiffImage.FrameDimensionsList[0];  
        //create the frame dimension 
        FrameDimension dimension = new FrameDimension(objGuid); 
        //Gets the total number of frames in the .tiff file 
        int noOfPages = tiffImage.GetFrameCount(dimension);   
        if (noOfPages == 1) 
        { 
         splitFileNames.Add(InputFilePath); 
         tiffImage.Dispose(); 
         return splitFileNames; 
        } 
        string filName = Path.GetFileNameWithoutExtension(InputFilePath); 
        string fileExtention = Path.GetExtension(InputFilePath); 

        ImageCodecInfo encodeInfo = null; 
        ImageCodecInfo[] imageEncoders = ImageCodecInfo.GetImageEncoders(); 
        for (int j = 0; j < imageEncoders.Length; j++) 
        { 
         if (imageEncoders[j].MimeType == "image/tiff") 
         { 
          encodeInfo = imageEncoders[j]; 
          break; 
         } 

        // Save the tiff file in the output directory. 
        if (!Directory.Exists(OutputPath)) 
         Directory.CreateDirectory(OutputPath); 
        foreach (Guid guid in tiffImage.FrameDimensionsList) 
        { 
         for (int index = 0; index < noOfPages; index++) 
         { 
          FrameDimension currentFrame = new FrameDimension(guid); 

          tiffImage.SelectActiveFrame(currentFrame, index); 

          string outPath = string.Concat(OutputPath, filName, "-P", index + 1, fileExtention); 

          tiffImage.Save(outPath, encodeInfo, null); 

          splitFileNames.Add(outPath); 
         } 
        } 

        tiffImage.Dispose();    
        return splitFileNames; 

       } 
       catch (Exception ex) 
       { 
        return splitFileNames; 
       } 
      } 

ответ

2

A parallel foreach цикл может привести вас туда, где вам нужно быть.

FileInfo[] DispatchFiles = dir1.GetFiles(); 
Parallel.ForEach(DispatchFiles, aFile => 
{ 
    string files = input + aFile.Name; 
    if (File.Exists(files)) 
    { 
     Split(files, output); 
    } 
} 

С параллельной обработки вы можете столкнуться с некоторыми общими вопросами ресурсов, но если каждая обработка полностью независимы друг от друга, это должно улучшить производительность.

Если вам нужно ограничить количество потоков, созданных контуром, проверьте свойство MaxDegreeOfParallelism.

+0

спасибо за повторное воспроизведение Я хочу улучшить производительность в методе разделения, может предложить вам изображение tiffImage = Image.FromFile (InputFilePath), tiffImage.Save (outPath, encodeInfo, null) потребляет больше времени – user202

+0

Когда вы зависите от непрозрачной функции предоставленный кем-то другим, вы не можете знать, что он делает. Он может выполнять полное декодирование и повторное кодирование каждой страницы. Эффективная библиотека (например, моя) может выполнять задание в течение времени, которое требуется для чтения + записи данных на диск. – BitBank

Смежные вопросы