2012-07-27 45 views
2

当我使用SharpZipLib来解压zip文件,该文件在windows phone 7上有5000个文件。完成它需要5分多钟。 这里是代码:如何加快windows phone 7上的解压缩操作?

using (StreamReader httpwebStreamReader = new StreamReader(ea.Result)) 
      { 
       //open isolated storage to save files 
       using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication()) 
       { 
        using (ZipInputStream s = new ZipInputStream(httpwebStreamReader.BaseStream)) 
        { 
         //s.Password = "123456";//if archive is encrypted 
         ZipEntry theEntry; 
         while ((theEntry = s.GetNextEntry()) != null) 
         { 
          string directoryName = Path.GetDirectoryName(theEntry.Name); 
          string fileName = Path.GetFileName(theEntry.Name); 

          // create directory 
          if (directoryName.Length > 0) 
          { 
           isoStore.CreateDirectory(directoryName); 
          } 

          if (fileName != String.Empty) 
          { 
           //save file to isolated storage 
           using (BinaryWriter streamWriter = 
             new BinaryWriter(new IsolatedStorageFileStream(theEntry.Name, 
              FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write, isoStore))) 
           { 

            int size = 2048; 
            byte[] data = new byte[2048]; 
            while (true) 
            { 
             size = s.Read(data, 0, data.Length); 
             if (size > 0) 
             { 
              streamWriter.Write(data, 0, size); 
             } 
             else 
             { 
              break; 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 

为什么这么慢? 如何加速解压缩操作? 有谁知道?

+0

多线程是否可以在此工作? – wing 2012-07-27 09:20:35

+0

这是在模拟器还是在设备上?这两者之间的时间如何? – 2012-07-27 13:03:18

+0

我的诺基亚800上的时间超过5分钟,但在模拟器中只花了20秒! – wing 2012-07-30 03:45:45

回答

0

我认为你需要增加你的缓冲区大小。更改线路

int size = 2048; 
byte[] data = new byte[2048]; 

并更改2048喜欢的东西32768(32 * 1024)。

2KB块大小正在对闪存进行大量单独写入。根据我的经验,这是一件有点慢的事情,可能因设备而异。 32KB的块大小应该少16倍,但我不知道是否会导致16倍的加速。我有兴趣听回来。

+0

谢谢您的回答。我将尺寸更改为32768,需要3分钟。我认为这个zip文件有很多小文件,例如2KB,3KB。这是否意味着什么? – wing 2012-08-01 03:44:04

+0

即使它是zip文件中的一个大文件,您使用的2KB的小缓冲区大小也会减慢速度。接下来要尝试的是在循环中读取数据,但不要将其写入磁盘。然后,您可以查看瓶颈是处理zip文件还是将文件写入磁盘。我的猜测是把文件写入磁盘是一个缓慢的部分,在这种情况下,zip中有许多文件会让你更慢。让我知道如何进行测试。 – 2012-08-01 12:19:59

+0

谢谢你的建议。我将文件流更改为内存流。但它似乎不起作用...所以我将解压缩操作更改为另一个线程,似乎很好,但有时主线程会冻结...我如何处理解压缩线程?@。@ – wing 2012-08-03 03:20:35