2010-04-22 95 views
0

我試圖使用System.IO.Packaging.Package和PackagePart將大量二進制數據序列化爲自定義文件格式。我試圖使用BinaryFormatter將一組詳細的醫療成像數據集輸出到文件/包中的不同部分。C#中System.IO.Packaging速度問題

我可以使用BinaryFormatter將所有數據直接輸出到FileStream(根本不使用System.IO.Packaging),並且我的樣本數據在大約12秒內輸出約140meg的數據。雖然這個解決方案相當快速且不錯,但我更喜歡支持壓縮的更靈活的格式,並且能夠以靈活的格式存儲更多數據。

通過_packagePart.GetStream()獲取一個流,並嘗試通過BinaryFormatter將數據序列化到這個流中,這會導致我的數據序列化需要大約5到10分鐘的時間(並且壓縮關閉)。

System.IO.Packaging.Package類有些黑盒子,我沒有太多的經驗。任何知道爲什麼將數據流式傳輸到這種格式與直接二進制格式化器到文件在性能上會有很大差異?我知道我的對象可以相對快速地序列化爲二進制格式。爲什麼這麼長時間寫?

+0

也許發佈一些示例代碼 – Simon 2010-04-22 02:54:06

回答

2

我嘗試關閉壓縮(NotCompressed),速度差別很小。但我最終找到了一個可行的解決方案。

瞭解BinaryFormatter在不直接進入Package時似乎可以正常工作,而是首先將數據序列化爲MemoryStream。然後,使用下面的CopyStream函數,我將MemoryStream複製到PackageStream中。

public static void CopyStream(Stream input, Stream output) 
    { 
     byte[] buffer = new byte[32768]; 
     while (true) 
     { 
      int read = input.Read(buffer, 0, buffer.Length); 
      if (read <= 0) 
       return; 
      output.Write(buffer, 0, read); 
     } 
    } 

該解決方案得到我的序列化速度降低到10-15秒總(相對於10分鐘),偉大的事情是,我可以把在正常或高壓縮選項,並獲得約50%的壓縮上我的數據。

我並沒有很好的回答,爲什麼這會產生如此巨大的影響,但只是試圖讓我的代碼變成一種格式,我有更多的可見性在寫封裝的循環中查看我是否可以配置文件它更好。