2009-10-11 5 views
17

상당히 큰 파일을 읽어야하는 응용 프로그램을 작성 중입니다. 필자는 항상 최신 Windows XP 컴퓨터에서 읽기 버퍼의 최적 크기가 무엇인지 궁금해했습니다. 내가 봤 거든 1024 크기로 최적의 크기로 많은 예제를 발견. 여기 최적의 파일 버퍼 읽기 크기?

무슨 뜻인지의 조각입니다 :

long pointer = 0; 
buffer = new byte[1024]; // What's a good size here ? 
while (pointer < input.Length) 
{ 
    pointer += input.Read(buffer, 0, buffer.Length); 
} 

내 응용 프로그램은 매우 간단하다, 그래서 나는 어떤 벤치마킹 코드를 작성하기 위해 찾고 있지 않다, 그러나 일반적인 어떤 크기를 알고 싶습니다?

+0

도움이 될 수 있습니다. http://stackoverflow.com/questions/19558435/what-is-the-best-buffer-size-when-using-binaryreader-to-read-big-files-1gb/19837238? noredirect = 1 # 19837238 –

답변

7

버퍼 크기가 조금 작게 보입니다. 일반적으로 "한 크기는 모두 적합"버퍼 크기가 없습니다. 알고리즘의 동작에 맞는 버퍼 크기를 설정해야합니다. 자, 일반적으로, 정말 큰 버퍼를 갖는 것은 좋지 않지만, 너무 작거나 각 덩어리를 처리하는 방법과 일치하지 않는 것이 좋습니다.

데이터를 처리하기 전에 전체적으로 하나의 데이터 청크를 완전히 메모리로 읽는다면 더 큰 버퍼를 사용하게 될 것입니다. 아마 8k 또는 16k를 사용 하겠지만 아마도 크지 않을 것입니다.

한편 스트리밍 방식으로 데이터를 처리하는 경우 청크를 읽은 다음 처리하여 다음의 작은 버퍼를 읽는 것이 더 유용 할 수 있습니다. 더 나아가 구조가있는 데이터를 스트리밍하는 경우 읽는 데이터의 유형과 일치하도록 읽는 데이터의 양을 변경합니다. 예를 들어, 4 문자 코드, 부동 소수점 및 문자열을 포함하는 바이너리 데이터를 읽는 경우 4 바이트 코드를 4 바이트 배열과 float로 읽습니다. 문자열의 길이를 읽은 다음 문자열 데이터 전체를 한 번에 읽을 수있는 버퍼를 만듭니다.

스트리밍 데이터 처리를하고 있다면 BinaryReader 및 BinaryWriter 클래스를 살펴볼 것입니다. 이를 통해 데이터 자체에 대해 크게 걱정할 필요없이 매우 쉽게 바이너리 데이터로 작업 할 수 있습니다. 또한 작업중인 실제 데이터와 버퍼 크기를 분리 할 수 ​​있습니다. 기본 스트림에 16k 버퍼를 설정하고 BinaryReader로 개별 데이터 값을 쉽게 읽을 수 있습니다.

+0

BinaryReader를 사용해 주셔서 감사합니다. 길이를 쓰려면 위생 코드를 쓸 필요가 없기 때문에 BinaryReader를 사용하면 문자열을 읽을 때 도움이됩니다. 8K 및 16K 읽기를 테스트하여 성능이 향상되는지 확인합니다. 개인적으로 크기는 중요하지 않지만 품질 보증 담당자 중 일부는 하드웨어와 운영 체제를보다 잘 활용하여 성능을 향상시킬 수 있는지보고 싶어합니다. –

+0

많은 양의 데이터를 단순히 메모리로 스트리밍하는 경우 더 큰 버퍼를 사용해보십시오. 버퍼 크기를 디스크 클러스터 크기의 배수로 유지하는 한 최적이되어야합니다. 솔직히 말해서, 저는 아직도 90 년대 후반과 2000 년대 초반의 경험이 여전히 많이 뿌리 내렸다고 생각합니다. 이 프로그램을 실행하는 시스템이 현대적이고 고성능 인 경우 32k, 64k 이상의 버퍼가 도움이 될 수 있습니다. 너가 너무 커 (1MB라고 말하면), 다른 요인들이 닥칠 때마다 (스왑 스 래싱) 수익이 줄어들 수도 있습니다. 핵심은 읽기와 하위 수준 동작을 일치시키는 것입니다. – jrista

3

액세스 시간과 메모리 사용량 사이의 줄을 어디에 사용하는지에 따라 다릅니다. 버퍼가 클수록 메모리가 더 빨라지지만 메모리가 더 비쌉니다. 복수형 읽기 파일 시스템 클러스터 크기의이 NTFS를 사용하는 Windows XP 시스템에서 가장 효율적일 수 있습니다. 4K가 기본 클러스터 크기입니다.

이 링크 Default cluster size for NTFS, FAT, and exFAT

안녕을 볼 수 있습니다.

+0

@jrista가 제안한 8K 및 16K 읽기를 시도합니다. Windows가 16TB 디스크 파티션에 8K 클러스터를 사용한다고하는 흥미로운 점이 있습니다. 전에 큰 파티션을 보지 못했습니다. –

+1

Andrew, 8K 및 16K는 4K를 모방합니다 – RRUZ

+0

이전 하드 드라이브는 한 번에 512 바이트 섹터 전체를 읽고 씁니다. 현대의 하드 드라이브는 한 번에 4096 바이트의 전체 섹터를 읽고 씁니다. Windows NTFS는 (기본값) 4096 바이트의 클러스터 크기를가집니다. Windows 용 이벤트 추적을 사용하면 Windows가 '1696 바이트'와 '4,096 바이트'(그리고 '8192'및 '49152 바이트 미만)와 함께 실제 하드 드라이브 입출력을 가장 많이 수행한다는 것을 알 수 있습니다. 이상적으로는 4k 또는 16384 바이트의 배수로 유지하십시오. –