Atualizar

Atualizar

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

Se eu usar exatamente o mesmo código, mas em vez de escrever os 5.000 blocos diferentes, repito os mesmos dados continuamente (por exemplo, escrevendo 500 vezes os primeiros 10 blocos), o tempo médio de gravação será inferior a 2 ms por arquivo - como se de alguma forma, o sistema de arquivos é capaz de otimizar as gravações porque os dados são os mesmos.

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

Testando 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 WriteAllBytes()chamada para escrever bytes[ i % 10 ](repetindo os primeiros 10 valores repetidamente), o tempo por arquivo cai para menos de 2 ms

Atualizar

Não é desduplicação:

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

Responder1

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

informação relacionada