更新

更新

我有一些測試程式碼,可以產生5​​000 個小資料塊的列表(最小大小:351 字節,最大大小:386 字節,平均大小:385 字節),然後將它們作為單獨的文件寫入目錄- 平均寫入時間為每個檔案約 5 毫秒

如果我使用完全相同的程式碼,但不是寫入5000 個不同的區塊,而是一遍又一遍地重複相同的資料(例如,寫入前10 個區塊500 次),則每個檔案的平均寫入時間將少於2 毫秒- 就好像在某種程度上,檔案系統能夠優化寫入,因為資料是相同的。

有人對這種行為有解釋嗎?

在具有 8 GB RAM 的 Surface Pro 4 - i5 處理器上進行測試,寫入內建固態硬碟。作業系統是Windows 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版本支援資料「重複資料刪除」。您的系統上可能啟用了此功能,如果是這樣,作業系統正在偵測重複寫入並指派指向公用檔案系統資料的「指標」。這樣做的效果是 NT 只會更新目錄區塊,而不必為重複檔案分配和寫入新的檔案系統區塊,從而顯著減少 I/O。

相關內容