업데이트

업데이트

5000개의 작은 데이터 블록(최소 크기: 351바이트, 최대 크기: 386바이트, 평균 크기: 385바이트) 목록을 생성한 다음 이를 별도의 파일로 디렉터리에 쓰는 테스트 코드가 있습니다. 평균 쓰기 시간은 파일당 약 5msec

동일한 코드를 사용하지만 5000개의 다른 블록을 작성하는 대신 동일한 데이터를 반복해서 반복하는 경우(예: 처음 10개 블록을 500회 작성) 평균 쓰기 시간은 파일당 2msec 미만이 됩니다. 어떤 방식으로든 파일 시스템은 데이터가 동일하기 때문에 쓰기를 최적화할 수 있습니다.

이 행동에 대한 설명이 있는 사람이 있습니까?

8GB RAM이 탑재된 Surface Pro 4 - i5 프로세서에서 내장 솔리드 스테이트 드라이브에 쓰는 테스트입니다. 운영체제는 윈도우 10이다.

테스트 코드:

const int count = 5_000;

// Generate a list of count small byte arrays: min. size: 351, max size: 386, average size: 385
var bytes = SerializeObjects( count );
// Write them all to disk as individual files
var watch = Stopwatch.StartNew();
for ( var i = 0; i < count; i++ )
{
    File.WriteAllBytes(
        Path.Combine( _directory, Guid.NewGuid() + ".xml" ),
        bytes[ i ]
    );
}
watch.Stop();
// Timed at: around 5ms per file
Console.WriteLine( "Wrote {0:n0} files in {1:n0} ms ({2:n3} ms per file)", count, watch.ElapsedMilliseconds, (double)watch.ElapsedMilliseconds / count );

WriteAllBytes()쓰기 호출을 수정하면 bytes[ i % 10 ](따라서 처음 10개 값을 계속해서 반복) 파일당 시간이 2밀리초 미만으로 줄어듭니다.

업데이트

중복 제거가 아닙니다.

PS > Get-DedupProperties C
Get-DedupProperties : Deduplication feature is not available

답변1

Server 2012 이후의 Windows 버전은 데이터 "중복 제거"를 지원합니다. 시스템에서 이 기능이 활성화되어 있을 수 있으며, 그렇다면 OS는 중복된 쓰기를 감지하고 공통 파일 시스템 데이터에 "포인터"를 할당합니다. 이로 인해 NT는 디렉토리 블록만 업데이트하고 중복 파일에 대해 새 파일 시스템 블록을 할당하고 쓸 필요가 없으므로 I/O가 크게 줄어듭니다.

관련 정보