2012-04-20 134 views
1

我正在編寫一個應用程序來讀取和分析大小可能爲1 KB到200 MB的文件。最快讀取二進制文件讀取和寫入

我必須分析它的兩倍......

  1. 提取該文件中包含的圖像。

  2. 解析該圖像提取圖像的內容。

我一般使用文件流,緩衝流,二進制讀取器和二進制寫入器來讀取和寫入內容。

現在,我想知道讀取文件並解壓速度最快和最有效的方式...

有沒有好的方法還是不錯的類庫?

注意:不安全的代碼是好的!

+0

這裏最大的性能改進是通過一次性解析文件來獲得的。這會避免你兩次掃描圖像 – 2012-04-20 01:52:40

+0

@Luke實際上,圖像包含在區塊中,圖像中的一些字節在解析之前應該被刪除[記錄]。 – Writwick 2012-04-20 01:56:01

+0

是的,就使用.NET文件對象而言,在您讀取文件時的原始速度方面應該沒有太大的性能差異。你有什麼理由想要優化它? – 2012-04-20 01:57:22

回答

9

讀取該文件,最簡單的辦法就是:

var file = File.ReadAllBytes(fileName); 

將讀取整個文件的字節數組到內存中。然後你可以通過它尋找你需要的內存數組訪問速度(也就是說,非常快)。這幾乎肯定會比您在閱讀時處理文件更快。

但是,如果這個文件不能很好地適應內存(和MB),那麼你需要以塊的形式做到這一點。如果不需要,我們可以安全地避免這種棘手的討論。在這種情況下,解決方案將實行:

  1. 如果使用.NET 4.0,(在What are the advantages of memory-mapped files?更多)使用memory mapped files

  2. 如果不是,你需要大塊讀取,緩存和保持你認爲你在內存中需要的東西(爲了提高效率)或重新讀取它,你根本無法將它保存在內存中。這可能變得雜亂和緩慢。

+1

其實原始文件包含HEADER和ACHUNK和BCHUNK [ACHUNK和BCHUNK是兩種類型的塊]圖像包含在BCHUNK中,因此我應該讀取這些塊... 我可能正在使用內存映射文件[我有想法在開始編碼這個Lib之前使用它],但我不確定它的可靠性。但現在我可能不得不使用它來提高性能。我不會將它標記爲答案,但它確實幫助了我。 – Writwick 2012-04-20 11:52:18

+0

那麼,你可以投票。無論如何,沒有關於你的問題尖叫內存映射文件。 'ReadAllBytes'將完成你所需要的任何事情,而且快速簡單。無論如何。 – yamen 2012-04-20 13:23:08

+0

我無法投票,因爲我的聲望低於15。 我不應該使用'ReadAllBytes',因爲數組函數比FileStream函數慢。 – Writwick 2012-04-20 17:01:49