왜 fsutil.exe가 프로그래밍 방식보다 거대한 파일을 디스크에 쓰는 데 시간이 덜 걸리나요?

StackOverflow https://stackoverflow.com/questions/1893200

  •  19-09-2019
  •  | 
  •  

문제

이 질문은이 주제에 따른 것입니다.C#에서 몇 초 만에 거대한 더미 파일 만들기

방금 XP/Vista/Seven에서 fsutil.exe를 확인하여 엄청난 양의 더미 데이터를 스토리지 디스크에 작성했으며 프로그래밍 방식과 비교하여 큰 파일을 작성하는 데 시간이 덜 걸립니다.

.NET의 도움으로 똑같은 일을하려고 할 때는 fsutil.exe보다 훨씬 더 많은 시간이 걸립니다.

참고 : .NET은 기본 코드를 사용하지 않기 때문에이 문제를 다음과 같이 네이티브 API로 확인했기 때문에 다음과 같이이 문제를 확인했습니다.

long int size = DiskFree('L' - 64);
const char* full = "fulldisk.dsk";
__try{
Application->ProcessMessages();
HANDLE hf = CreateFile(full,
                       GENERIC_WRITE,
                       0,
                       0,
                       CREATE_ALWAYS,
                       0,
                       0);
SetFilePointer(hf, size, 0, FILE_BEGIN);
SetEndOfFile(hf);
CloseHandle(hf);
}__finally{
    ShowMessage("Finished");
    exit(0);

그리고 대답은 .NET 결과와 동일했습니다.

그러나 fsutil.exe의 도움으로 위 또는 .NET 접근 방식보다 더 적은 시간 만 소요되면 2 배 더 빠르다고 말합니다.

예 : .NET으로 400MB를 작성하려면 fsutil.exe와 동일한 양이 ~ 40 초가 걸립니다. 약 20 초 이하가됩니다.

그것에 대한 설명이 있습니까? 또는 어떤 기능 fsutil.exe를 사용 하는가?

도움이 되었습니까?

해결책

나는 Fsutil이 무엇을하고 있는지 정확히 알지 못하지만 위에서했던 것보다 더 빠른 큰 파일을 작성하는 두 가지 방법을 알고 있습니다 (또는 원하는 길이를 찾고 동일합니다. 결과).

이러한 접근 방식의 문제점은 쓰기를 할 때 파일을 제로 채우는 것입니다.

다음 중 하나에 의해 제로 요금을 피할 수 있습니다.

  1. 희소 파일 생성. 크기는 원하는 위치에 표시되지만 데이터는 실제로 디스크에 표시되지 않습니다. 기록되지 않은 지역의 모든 읽기는 0을 반환합니다.
  2. 사용 setFileValidData 기능 파일을 먼저 제로화하지 않고 유효한 데이터 길이를 설정하도록 함수. 그러나 잠재적 인 보안 문제로 인해이 명령에는 높은 권한이 필요합니다.

다른 팁

나는 마지막 의견에 동의합니다. 나는 미니 필터 드라이버를 실험하고 있었고 콜백에서 IRP_MJ_WRITE IRP를 캡처하고있었습니다. CMD 라인 또는 Win32 응용 프로그램에서 파일을 작성하거나 작성하면 쓰기가 다운되는 것을 볼 수 있습니다. 그러나 "fsutil 파일 CreateNew ..."명령을 사용하여 파일을 만들었을 때, 나는 글을 볼 수 없습니다. NTFS 볼륨에서 Win2K8 R2 에서이 동작을보고 있습니다. 그리고 나는 그것이 100% 확실하지 않다고 생각하지 않습니다. 그것은 희소 파일이라고 생각합니다. 클러스터를 할당하지 않고 MFT에서 크기 속성을 설정하고있을 것입니다. FSUTIL 사용 가능한 여유 공간을 점검하므로 파일 크기가 디스크의 여유 공간보다 크면 오류가 발생합니다.

또한 프로그램 Sening fsctl_get_retrieval_pointers를 파일에 실행했으며 파일의 전체 크기에 대해 한 범위를 얻었습니다. 그러나 나는 그것이 모든 데이터를 얻고 있다고 생각합니다

이것은 할 수있는 것입니다

  • 어셈블러로 작성 (원시 블라인드 속도)
  • 이를 위해 기본 C/C ++ 코드
  • 어쩌면 문서화되지 않은 시스템 호출 또는 아무데도 문서화되지 않은 트릭을 수행 할 수 있습니다.

위의 세 점은 큰 중요한 요소를 가질 수 있습니다. 생각할 때 .NET 코드가로드되면 런타임에 의해 Jit'ted가됩니다 (OK, 빠른 기계가 있으면 시간 요소가 눈에 띄지 않습니다. - 낮은 종료 펜티엄에서는 눈에 띄고 부진한 하중이 줄어 듭니다).

C/C ++로 작성되었을 가능성이 높습니다. 어셈블러로 작성된 경우 놀라울 수 있습니다.

이를 직접 확인할 수 있습니다. 실행 파일의 파일 크기를보고 .NET의 실행 파일과 비교하십시오. 파일이 압축되었다고 주장 할 수 있습니다. 이는 그것이 의심스럽고이를 배제하는 경향이있을 것입니다. Microsoft는 압축 실행 제품 비즈니스와는 거리가 멀지 않을 것입니다.

이것이 당신의 질문에 답하기를 바랍니다.

FSUTIL은 FAT32가 아닌 NTF 및 ExFAT에서만 빠르며 FAT16 일부 파일 시스템에는 "초기화 된 크기"가 포함되어있어 빠른 파일 초기화를 지원하기 때문입니다. 파일 시스템에 파일에 데이터가 기록되지 않았으며 유효한 판독 값이 모두 00으로 채워진 버퍼를 반환한다는 점에 유의하기 때문에 클러스터는 단지 클러스터를 보유하지만 제로화하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top