NTFS - escrevendo variações de desempenho de arquivos pequenos

2

Eu tenho um código de teste que gera uma lista de 5000 pequenos blocos de dados (tamanho mínimo: 351 bytes, tamanho máximo: 386 bytes, tamanho médio: 385 bytes) e os grava como arquivos separados em um diretório - média tempo de gravação é de cerca de 5 ms por arquivo

Se eu usar o mesmo código exato, em vez de escrever os 5000 blocos diferentes, repito os mesmos dados várias vezes (por exemplo, escrevendo 500 vezes o primeiro bloco 10), o tempo médio de gravação vai para menos de 2 ms por arquivo - como se de alguma forma o sistema de arquivos fosse capaz de otimizar as gravações porque os dados são os mesmos.

Alguém tem uma explicação para esse comportamento?

Teste em um processador Surface Pro 4-i5 com 8 GB de RAM, gravando na unidade de estado sólido integrada. O sistema operacional é o Windows 10.

Código de teste:

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 );

modificando a chamada WriteAllBytes() para escrever bytes[ i % 10 ] (repetindo assim os 10 primeiros valores repetidas vezes) o tempo por arquivo desce para menos de 2 mseg

Atualizar

Não é dedup:

PS > Get-DedupProperties C
Get-DedupProperties : Deduplication feature is not available
    
por MiMo 22.03.2018 / 17:13

1 resposta

1

As versões do Windows desde o Server 2012 suportam dados "deduplicação". É possível que isso esteja habilitado em seu sistema e, em caso afirmativo, o SO esteja detectando as gravações duplicadas e alocando "ponteiros" para os dados comuns do sistema de arquivos. O efeito disso seria que o NT estaria apenas atualizando os blocos de diretório e não tendo que alocar e gravar novos blocos de sistema de arquivos para os arquivos duplicados, reduzindo significativamente a E / S.

    
por 22.03.2018 / 19:15