我有一些測試程式碼,可以產生5000 個小資料塊的列表(最小大小: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。