與HxD編輯器中的功能非常類似,我正在實現一個程序,該程序可以搜索特定的十六進制值(比如32位)一個大的二進制文件(> 1 GB)。內存是有限的,看起來塊讀塊很慢,BinaryReader
類。 HxD在大約12秒內返回搜索結果(幾乎達到文件的結尾),這是可以接受的。在C#中的大二進制文件中搜索十六進制值的有效方式是什麼?
3
A
回答
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
出於某種原因,您應該預期類似的性能會隨着較大緩衝區的增加而增加。
相關問題
- 1. 什麼是這種格式?二進制?十六進制?
- 2. 十六進制,八進制,二進制到十進制(C++)
- 3. 大十六進制到二進制
- 4. O_APPEND的十六進制值是什麼?
- 5. 在文件中替換十進制的所有十六進制
- 6. 什麼是十六進制?
- 7. 十六進制爲二進制和十進制在matlab中
- 8. 十六進制爲二進制形式,需要說明什麼?
- 9. C#System.OverflowException二進制到十進制和十六進制轉換
- 10. 什麼類型的數據(二進制,十六進制...)在列中格式化?
- 11. 使用sfk替換二進制文件中的十六進制
- 12. 在大文件中將十六進制轉換爲二進制文件
- 13. 在Perl中將十六進制轉換爲二進制文件
- 14. 將十六進制轉換爲二進制到十六進制?
- 15. 在C++中將十六進制十六進制字符標記爲十進制
- 16. 轉換二進制,十進制,六進制等位的作用是什麼?
- 17. 在Visual C++中將十進制值轉換爲十六進制
- 18. 創建從十六進制二進制文件用C
- 19. 二進制,八進制,十六進制到十進制程序
- 20. 在像bash這樣的shell中,在二進制文件中看到二進制而不是十六進制
- 21. c#二進制運算在十六進制值
- 22. 將十六進制和二進制值寫入文件
- 23. 如何將十六進制值寫入二進制文件
- 24. 混淆將C++中的十六進制轉換爲二進制
- 25. 如何在Perl中將十六進制值輸出到二進制文件中?
- 26. C++讀文件,搜索十六進制,輸出文件
- 27. 從十六進制到十進制,二進制到十進制和八進制到十進制程序C++
- 28. 使用十六進制而不是十進制更有效嗎?
- 29. 在C中指定位圖文件中的十六進制值
- 30. 從二進制文件創建十六進制文本文件
你是什麼意思「尋找十六進制值」?它是「搜索字節序列」還是「搜索代表十六進制形式的數字的文本'0xff123456'」?另外請顯示代碼,因爲很難理解爲什麼你聲稱'BinaryReader'很慢...... –