2013-07-08 71 views
0

是否有可能使用Parallel.Foreach或其他來優化此代碼?並行壓縮C#

using (var zipStream = new ZipOutputStream(OpenWriteArchive())) 
{ 
    zipStream.CompressionLevel = CompressionLevel.Level9;  
    foreach (var document in docuemnts) 
    { 
     zipStream.PutNextEntry(GetZipEntryName(type));  
     using (var targetStream = new MemoryStream()) // document stream 
     { 
      DocumentHelper.SaveDocument(document.Value, targetStream, type);  
      targetStream.Position = 0; targetStream.CopyTo(zipStream); 
     }  
     GC.Collect(); 
    }; 
} 

問題是DotNetZip的和SharpZipLib的ZipOutputStream不支持位置改變或尋求。

從多個線程寫入zip流會導致錯誤。將結果流積累到 也是不可能的ConcurrentStack beacuse應用程序可以與1000多個文檔一起使用,並且應該在運行時將流壓縮並保存到雲 中。

有什麼辦法解決這個問題嗎?

+0

你*有*將所有文件壓縮到一個相同的檔案? –

+0

是的,所有條目(文檔)應該放在同一個存檔中 –

+0

如果ZipOutputStream * did *支持查找和位置更改,並且您設法實現了一個允許多個線程同時寫入的編組系統,它仍然會成爲你的瓶頸。 這樣的編組系統可能會導致比平行處理更多的開銷。 –

回答

0

通過使用ProducerConsumerQueue(生產者 - 消費者模式)來解決。

using (var queue = new ProducerConsumerQueue<byte[]>(HandlerDelegate)) 
{ 
    Parallel.ForEach(documents, document => 
    { 
     using (var documentStream = new MemoryStream()) 
     { 
      // saving document here ... 

      queue.EnqueueTask(documentStream.ToArray()); 
     } 
    }); 
} 

protected void HandlerDelegate(byte[] content) 
{ 
    ZipOutputStream.PutNextEntry(Guid.NewGuid() + ".pdf"); 

    using (var stream = new MemoryStream(content)) 
    { 
     stream.Position = 0; stream.CopyTo(ZipOutputStream); 
    } 
} 
0

嘗試decleare zipstream並行的foreach裏面,如:

Parallel.ForEach(docuemnts, (document) => 
      { 
       using (var zipStream = new ZipOutputStream(OpenWriteArchive())) 
       { 
        zipStream.CompressionLevel = CompressionLevel.Level9; 
        zipStream.PutNextEntry(GetZipEntryName(type)); 
        using (var targetStream = new MemoryStream()) // document stream 
        { 
         DocumentHelper.SaveDocument(document.Value, targetStream, type); 
         targetStream.Position = 0; targetStream.CopyTo(zipStream); 
        } 
        GC.Collect(); 
       } 
      }); 

再見!

+0

所有文檔應該在同一個檔案中 –