2012-11-16 51 views
3

HxD編輯器中的功能非常類似,我正在實現一個程序,該程序可以搜索特定的十六進制值(比如32位)一個大的二進制文件(> 1 GB)。內存是有限的,看起來塊讀塊很慢,BinaryReader類。 HxD在大約12秒內返回搜索結果(幾乎達到文件的結尾),這是可以接受的。在C#中的大二進制文件中搜索十六進制值的有效方式是什麼?

+0

你是什麼意思「尋找十六進制值」?它是「搜索字節序列」還是「搜索代表十六進制形式的數字的文本'0xff123456'」?另外請顯示代碼,因爲很難理解爲什麼你聲稱'BinaryReader'很慢...... –

回答

5

BinaryReader應該能夠在12秒內讀取一個千兆字節,前提是您的磁盤子系統可以處理它(它顯然可以,因爲HxD正在這樣做)。關鍵是用更大的輸入緩衝區打開文件。也就是說,而非:

var f = File.OpenRead(filename) 

呼叫

var f = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.None, 65536); 

這將導致.NET讀取該文件在64KB的塊,而不是默認的4 KB塊。

雖然你爲什麼使用BinaryReader是一件神祕的事情。爲什麼不直接讀取流?例如:

var buff = new byte[1024*1024]; 
int bytesRead = f.Read(buff, 0, buff.Length); 

對於64 KB的文件緩衝區,.NET必須僅向OS發出16個調用以滿足您的請求。使用默認的4K緩衝區,它將不得不對OS進行256次調用。差異是顯着的。

使用大於64千字節的緩衝區大小參數在性能改進方面沒有多大幫助。而大於256 KB的緩衝區實際上導致系統在測試中讀取速度較慢。至少在我測試過的系統上,64KB似乎是「最佳位置」。

如果您決定使用BinaryReader出於某種原因,您應該預期類似的性能會隨着較大緩衝區的增加而增加。

相關問題