Aktualisieren

Aktualisieren

Ich habe einen Testcode, der eine Liste mit 5000 kleinen Datenblöcken (min. Größe: 351 Byte, max. Größe: 386 Byte, durchschnittliche Größe: 385 Byte) generiert und diese dann als separate Dateien in ein Verzeichnis schreibt – die durchschnittliche Schreibzeit beträgt etwa 5 ms pro Datei

Wenn ich genau denselben Code verwende, aber statt 5.000 verschiedene Blöcke zu schreiben, dieselben Daten immer wieder wiederhole (z. B. 500 Mal die ersten 10 Blöcke schreibe), sinkt die durchschnittliche Schreibzeit auf weniger als 2 ms pro Datei – als ob das Dateisystem die Schreibvorgänge irgendwie optimieren könnte, weil die Daten dieselben sind.

Hat jemand eine Erklärung für dieses Verhalten?

Test auf einem Surface Pro 4 - i5-Prozessor mit 8 GB RAM, Schreiben auf das eingebaute Solid-State-Laufwerk. Betriebssystem ist Windows 10.

Testcode:

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

Durch Ändern des WriteAllBytes()Schreibaufrufs bytes[ i % 10 ](also durch wiederholtes Wiederholen der ersten 10 Werte) sinkt die Zeit pro Datei auf weniger als 2 ms

Aktualisieren

Es ist nicht dedupliziert:

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

Antwort1

Windows-Versionen seit Server 2012 unterstützen die Datendeduplizierung. Möglicherweise ist dies auf Ihrem System aktiviert. Wenn dies der Fall ist, erkennt das Betriebssystem die doppelten Schreibvorgänge und weist den gemeinsamen Dateisystemdaten „Zeiger“ zu. Dies hätte zur Folge, dass NT nur Verzeichnisblöcke aktualisiert und keine neuen Dateisystemblöcke für die doppelten Dateien zuweisen und schreiben muss, was die E/A erheblich reduziert.

verwandte Informationen