C#

2012-11-16 2 views
3

의 큰 바이너리 파일에서 16 진수 값을 검색하는 효율적인 방법 HxD 편집기의 기능과 매우 흡사하게 특정 16 진수 값 (예 : 32 비트)을 검색하는 프로그램을 구현하고 있습니다. 큰 바이너리 파일 (> 1GB). 메모리가 제한되어 있고 청크로 청크 읽기가 매우 느리며 BinaryReader 클래스로 보인다. HxD는 약 12 ​​초 내에 검색 결과 (파일의 거의 끝에 도달)를 반환합니다.C#

+0

"16 진수 값 검색"은 무엇을 의미합니까? "바이트 순차 검색"또는 "16 진수 형식의 숫자를 나타내는 텍스트 검색"0xff123456 ""입니까? 또한'BinaryReader'가 느린 이유를 주장하는 이유를 설명하기가 매우 어렵 기 때문에 코드를 보여주십시오 ... –

답변

5

BinaryReader은 디스크 하위 시스템에서 처리 할 수있는 한 12 초 안에 기가 바이트를 읽을 수 있어야합니다 (HxD가 수행하고 있기 때문에 분명히 할 수 있습니다). 키가 더 큰 입력 버퍼로 파일을 여는 중입니다. .NET은 64킬로바이트 덩어리가 아니라 기본 4킬로바이트 청크에서 파일을 읽을하게됩니다

var f = File.OpenRead(filename) 

전화

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

: 그보다는이다.

BinaryReader을 사용하는 이유는 무엇보다 신비입니다. 직접 스트림을 읽지 않는 이유는 무엇입니까? 예를 들면 다음과 같습니다.

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

64KB 파일 버퍼를 사용하면 .NET에서 요청을 수행하기 위해 OS를 16 번만 호출해야합니다. 기본 4K 버퍼를 사용하면 OS를 256 번 호출해야합니다. 그 차이는 놀랍습니다.

64KB보다 큰 버퍼 크기 인수를 사용한다고해서 성능이 향상되지 않습니다. 그리고 256 KB보다 큰 버퍼는 실제로 테스트에서 시스템이 더 느리게 읽을 수있게했습니다. 적어도 64 KB는 내가 테스트 한 시스템에서 "가장 좋은 곳"인 것 같습니다.

BinaryReader을 어떤 이유로 사용하기로 결정하면 큰 버퍼로 비슷한 성능이 향상 될 것으로 예상됩니다.