2016-06-30 9 views
0

Ich habe einige Legacy-Code, der ziemlich einfach ist. Code extrahiert Dateien aus einer ZIP-Datei, demerialisiert den Inhalt der Datei aus der ZIP-Datei von XML in Objekte und macht etwas mit diesen Objekten.Code arbeitet viel langsamer auf Produktionsserver

Zip-Datei ist um 90mb. Das Problem ist, dass dieser Code ungefähr 3 Sekunden auf dem lokalen Computer ausgeführt wird (1,5 Sekunden zum Extrahieren und ungefähr 1,3 Sekunden zum Deserialisieren aller Dateien), aber wenn ich diesen Code auf Windows Server und IIS 6.1 veröffentliche, dauert es ungefähr 28 Sekunden die gleiche Aktion mit der gleichen Datei. 14 Sekunden zum Extrahieren und 13 Sekunden zum Deserialisieren.

Server ist VPS, 8 Kerne, 16 GB RAM.

Hat jemand irgendwelche Ideen?

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

Wahrscheinlich Festplattenproblem, SSD vs HDD? –

+0

90mb Datei und das ist ein großer Unterschied? Btw lokalen Rechner hat keine SSD – Robert

+1

Ist die Zip-Datei auf dem Server oder Zugriff über ein Netzwerk? –

Antwort

0

Es war etwas in der VPS selbst. Nach 7 Tagen der Forschung, Hosting-Provider-Mitarbeiter angeboten, auf eine neue Maschine zu migrieren, und alles scheint jetzt in Ordnung zu sein.

2

Durch die Optimierung der foreach-Schleife mit einer Parallel.Foreach-Schleife wird das Entpacken der Dateien mit mehreren Threads geplant. Je mehr Threads, desto schneller geht es. Ich sage nicht, dass es sich nicht um ein Hardware-, Netzwerk-, Firewall- oder Antivirus-Problem auf dem Server handelt - aber es ist nicht ratsam, Hardware auf ein Softwareproblem zu werfen.

Hier ist eine MSDN Link, die sich als nützlich erweisen kann.

Ihr Code würde in etwa so aussehen:

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); 
    } 
} 
Verwandte Themen