2016-06-30 9 views
0

私はかなり基本的なコードをいくつか持っています。コードはZIPファイルからファイルを抽出し、ZIPのファイル内容をXMLからオブジェクトにデシリアライズし、そのオブジェクトで何かを行います。コードはプロダクションサーバではるかに遅く動作します

ジップファイルは約90 MBです。この問題は、このコードがローカルマシン上で約3秒間(抽出するのに1.5秒、すべてのファイルを非直列化するのに約1.3秒)実行しますが、WindowsサーバーとIIS 6.1にコードを公開すると約28秒かかります同じファイルで同じアクションを実行します。抽出するには14秒、デシリアライズするには13秒。

サーバはVPS、8コア、16GB RAMです。

誰にもアイデアはありますか?

public List<FileNameStream> UnzipFilesTest(List<string> files, string zippedPathAndFile) 
     { 
      //var result = new Dictionary<string, MemoryStream>(); 
      var unzipedFiles = new List<FileNameStream>(); 
      string file1 = System.Web.Hosting.HostingEnvironment.MapPath(zippedPathAndFile); 


      if (File.Exists(file1)) 
      { 

       using (MemoryStream data = new MemoryStream()) 
       { 

        using (Ionic.Zip.ZipFile zipFile = Ionic.Zip.ZipFile.Read(file1)) 
        { 
         zipFile.ParallelDeflateThreshold = -1; 
         foreach (ZipEntry e in zipFile) 
         { 

          if (files.Contains(e.FileName, StringComparer.OrdinalIgnoreCase)) 
          { 

           e.Extract(data); 

           unzipedFiles.Add(new FileNameStream() { FileContent = Encoding.UTF8.GetString(fs..ToArray()), FileName = e.FileName }); //(e.FileName, data); 

          } 
         } 
        } 
       } 
      } 


      return unzipedFiles; 
     } 
+0

おそらくハードドライブの問題は、SSDとHDD? –

+0

90mbファイルとそれほど違いはありますか? BtwローカルマシンにSSDがありません – Robert

+1

zipファイルはサーバー上にありますか、またはネットワーク経由でアクセスされていますか? –

答えて

0

それはVPS自体で何かだった:

あなたのコードは次のようになります。 7日間の調査の後、ホスティングプロバイダのスタッフが新しいマシンに移行することを提案しました。すべてのものが順調に進んでいるようです。

2

複数のスレッドを使用してファイルを解凍する作業をスケジュールしますParallel.Foreachループを使用してforeachループを最適化します。スレッド数が増えるほど速くなります。私はそれがサーバー上のハードウェア、ネットワーク、ファイアウォール、またはウイルス対策の問題ではないと言っているわけではありませんが、ソフトウェアの問題でハードウェアを投げるのは賢明ではありません。

MSDN Linkここには役に立つと思われるものがあります。

Parallel.ForEach(zipEntires, (e) => 
{ 
    if (files.Contains(e.FileName, StringComparer.OrdinalIgnoreCase)) 
    { 
     e.Extract(data); 
     unzipedFiles.Add(new FileNameStream() { FileContent = Encoding.UTF8.GetString(fs..ToArray()), FileName = e.FileName }); //(e.FileName, data); 
    } 
} 
関連する問題