2011-07-05 2 views
5

.NET에서 파일 IO를 수행 할 때 표시되는 예제의 95 %가 4096 바이트 버퍼를 사용하는 것으로 보입니다. 버퍼 길이에 대해 4kb의 특별한 점은 무엇입니까? 또는 for 루프의 인덱스에 i를 사용하는 것과 같은 규칙일까요?버퍼 길이에 대해 4kb의 특별한 점은 무엇입니까?

+1

가능한 최적의 파일 버퍼 크기? (http://stackoverflow.com/questions/1552107/optimum-file-buffer-read-size) –

답변

7

4T는 최대 16TB 디스크의 기본 클러스터 크기이기 때문입니다. 따라서 버퍼 크기를 선택할 때 클러스터 크기의 배수로 버퍼를 할당하는 것이 좋습니다.

클러스터는 파일 할당의 최소 단위이므로 파일에 1 바이트 만 있으면 4K의 실제 디스크 공간을 사용합니다. 그리고 5K의 파일은 8K 할당을 초래할 것입니다.


업데이트은 :이 .NET에 OS 파일 블록 크기 --- 윈도우 관련이 있다는 것이다 드라이브의

using System; 
using System.Runtime.InteropServices; 

class Program 
{ 
    [DllImport("kernel32", SetLastError=true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    static extern bool GetDiskFreeSpace(
    string rootPathName, 
    out int sectorsPerCluster, 
    out int bytesPerSector, 
    out int numberOfFreeClusters, 
    out int totalNumberOfClusters); 

    static void Main(string[] args) 
    { 
    int sectorsPerCluster; 
    int bytesPerSector; 
    int numberOfFreeClusters; 
    int totalNumberOfClusters; 

    if (GetDiskFreeSpace("C:\\", 
      out sectorsPerCluster, 
      out bytesPerSector, 
      out numberOfFreeClusters, 
      out totalNumberOfClusters)) 
    {   
     Console.WriteLine("Cluster size = {0} bytes", 
     sectorsPerCluster * bytesPerSector); 
    } 
    else 
    { 
     Console.WriteLine("GetDiskFreeSpace Failed: {0:x}", 
     Marshal.GetLastWin32Error()); 
    } 

    Console.ReadKey(); 
    } 
} 
+0

아, 알 수 있습니다. 아마도 그와 비슷한 것이라고 생각했습니다. 런타임에 클러스터 크기가 디스크의 적응 크기를 결정할 수있는 방법이 있습니까? – sheikhjabootie

+0

관리되는 코드를 사용하여 클러스터 크기를 얻는 방법을 모르지만 P/Invoke를 사용하여 클러스터 크기를 가져 오는 데 필요한 정보를 반환하는 Win32 API 함수 인 GetDiskFreeSpace를 호출 할 수 있습니다. 필요하다면 나는 나중에 나의 dev 머신에있을 때 샘플을 제공 할 수있다. –

+0

@CodingHero, 클러스터 크기를 결정하는 빠른 샘플을 추가했습니다. 솔직히 말해서 버퍼 크기를 최적화하기 위해 지금까지 가지 않았지만, 4K 또는 8K와 같은 성능 테스트를 수행하고 필 요한 성능을 제공하고 필요한 작업을 수행하는지 확인하십시오. 메모리가 제한되어 있고 4K 버퍼를 사용할 여유가없는 장치에서 작업하는 경우에만 4K 미만으로 줄 것입니다. –

0

내 생각을 클러스터 크기를 얻기위한 코드 샘플을 추가했습니다.

+0

두 명의 남아프리카 인이 같은 질문을 세계 각지에서 대답한다고 상상해보십시오. –

+0

나는 단지이 코멘트를 보았다 :) --- 예, 우리는 도처에 있습니다! –

1

몇 가지 요소 :보다 더 자주는 아니지만

  • , 4K는 디스크 드라이브의 클러스터 크기
  • 4K는 Windows의 가장 일반적인 페이지 크기입니다, 그래서 4K의 OS가 할 수있는 메모리 맵 파일 청크
  • 4K 페이지는 종종 복사되지 않고 드라이브에서 OS로 사용자 프로세스로 전송 될 수 있습니다.
  • Windows는 4K 버퍼를 사용하여 RAM에 파일을 캐시합니다.

가장 중요한 것은 많은 사람들이 따라서 IO의 많은 및 OS 코드는 4K 버퍼에 최적화되어 위의 인해 버퍼 길이로 4K를 사용한 년 동안!

관련 문제