Actualizar

Actualizar

Tengo un código de prueba que genera una lista de 5000 pequeños bloques de datos (tamaño mínimo: 351 bytes, tamaño máximo: 386 bytes, tamaño promedio: 385 bytes) y luego los escribe como archivos separados en un directorio; el tiempo promedio de escritura es alrededor de 5 ms por archivo

Si uso exactamente el mismo código pero en lugar de escribir los 5000 bloques diferentes, repito los mismos datos una y otra vez (por ejemplo, escribiendo 500 veces los primeros 10 bloques), el tiempo promedio de escritura es de menos de 2 ms por archivo, como si de alguna manera el sistema de archivos puede optimizar las escrituras porque los datos son los mismos.

¿Alguien tiene una explicación para este comportamiento?

Prueba en un procesador Surface Pro 4 - i5 con 8 GB de RAM, escribiendo en la unidad de estado sólido incorporada. El sistema operativo es Windows 10.

Código de prueba:

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 la WriteAllBytes()llamada para escribir bytes[ i % 10 ](repitiendo así los primeros 10 valores una y otra vez) el tiempo por archivo se reduce a menos de 2 ms

Actualizar

No es deduplicación:

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

Respuesta1

Las versiones de Windows desde Server 2012 admiten la "deduplicación" de datos. Es posible que esto esté habilitado en su sistema y, de ser así, el sistema operativo esté detectando las escrituras duplicadas y esté asignando "punteros" a los datos comunes del sistema de archivos. El efecto de esto sería que NT sólo actualizaría los bloques de directorio y no tendría que asignar ni escribir nuevos bloques del sistema de archivos para los archivos duplicados, reduciendo así significativamente la E/S.

información relacionada