.NET에서 파일 IO를 수행 할 때 표시되는 예제의 95 %가 4096 바이트 버퍼를 사용하는 것으로 보입니다. 버퍼 길이에 대해 4kb의 특별한 점은 무엇입니까? 또는 for 루프의 인덱스에 i를 사용하는 것과 같은 규칙일까요?버퍼 길이에 대해 4kb의 특별한 점은 무엇입니까?
답변
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();
}
}
아, 알 수 있습니다. 아마도 그와 비슷한 것이라고 생각했습니다. 런타임에 클러스터 크기가 디스크의 적응 크기를 결정할 수있는 방법이 있습니까? – sheikhjabootie
관리되는 코드를 사용하여 클러스터 크기를 얻는 방법을 모르지만 P/Invoke를 사용하여 클러스터 크기를 가져 오는 데 필요한 정보를 반환하는 Win32 API 함수 인 GetDiskFreeSpace를 호출 할 수 있습니다. 필요하다면 나는 나중에 나의 dev 머신에있을 때 샘플을 제공 할 수있다. –
@CodingHero, 클러스터 크기를 결정하는 빠른 샘플을 추가했습니다. 솔직히 말해서 버퍼 크기를 최적화하기 위해 지금까지 가지 않았지만, 4K 또는 8K와 같은 성능 테스트를 수행하고 필 요한 성능을 제공하고 필요한 작업을 수행하는지 확인하십시오. 메모리가 제한되어 있고 4K 버퍼를 사용할 여유가없는 장치에서 작업하는 경우에만 4K 미만으로 줄 것입니다. –
내 생각을 클러스터 크기를 얻기위한 코드 샘플을 추가했습니다.
두 명의 남아프리카 인이 같은 질문을 세계 각지에서 대답한다고 상상해보십시오. –
나는 단지이 코멘트를 보았다 :) --- 예, 우리는 도처에 있습니다! –
몇 가지 요소 :보다 더 자주는 아니지만
- , 4K는 디스크 드라이브의 클러스터 크기
- 4K는 Windows의 가장 일반적인 페이지 크기입니다, 그래서 4K의 OS가 할 수있는 메모리 맵 파일 청크
- 4K 페이지는 종종 복사되지 않고 드라이브에서 OS로 사용자 프로세스로 전송 될 수 있습니다.
- Windows는 4K 버퍼를 사용하여 RAM에 파일을 캐시합니다.
가장 중요한 것은 많은 사람들이 따라서 IO의 많은 및 OS 코드는 4K 버퍼에 최적화되어 위의 인해 버퍼 길이로 4K를 사용한 년 동안!
- 1. 폐쇄에 대해 특별한 점은 무엇입니까?
- 2. Indexhibit의 특별한 점은 무엇입니까?
- 3. 클라우드 컴퓨팅에 특별한 점은 무엇입니까?
- 4. 코드 서명 인증서의 특별한 점은 무엇입니까?
- 5. const @ "SomeString"의 특별한 점은 무엇입니까?
- 6. (C++), "_MOVE_H"의 특별한 점은 무엇입니까?
- 7. 루프 배열 길이에 대해
- 8. WPF의 마우스 캡처 및 마우스 가운데 버튼의 특별한 점은 무엇입니까?
- 9. Magento Widgets API에 대해 혼란스러워하는 점은 무엇입니까?
- 10. Twisted에 대해 정말 멋진 점은 무엇입니까?
- 11. wget에 특별한 점이 있나요?
- 12. WCF에 대해 가장 아름다운 점은 무엇이라고 생각하십니까?
- 13. 새로운 MVC2 영역에 대해 아주 좋은 점은 무엇입니까?
- 14. 좋아하는 C++ 0x 기능에 대해 가장 싫어하는 점은 무엇입니까?
- 15. setjmp와 longjmp를 래핑하는 것에 대해 이상한 점은 무엇입니까?
- 16. XHTML과 호환되는 점은 무엇입니까?
- 17. HashMap.containsValue - 중요한 점은 무엇입니까?
- 18. jQuery의 멋진 점은 무엇입니까?
- 19. ASP.NET 진입 점은 무엇입니까?
- 20. 목표 -c에서이 점은 무엇입니까
- 21. AIDL - 중요한 점은 무엇입니까?
- 22. 예외를 던지는 점은 무엇입니까?
- 23. JADE의 흥미로운 점은 무엇입니까?
- 24. 점은,
- 25. 점은
- 26. Windows에서 CMake 명령 configure_file과 다른 점은 무엇입니까?
- 27. URL에서 "+"의 특별한 의미는 무엇입니까?
- 28. "tree"로 시작하는 gcc 플래그의 특별한 기능은 무엇입니까?
- 29. 길이에 의한 데이터 이동
- 30. 이 SQL에서 잘못된 점은 무엇입니까?
가능한 최적의 파일 버퍼 크기? (http://stackoverflow.com/questions/1552107/optimum-file-buffer-read-size) –