У меня есть тестовый код, который генерирует список из 5000 небольших блоков данных (минимальный размер: 351 байт, максимальный размер: 386 байт, средний размер: 385 байт), а затем записывает их как отдельные файлы в каталог — среднее время записи составляет около 5 мс на файл.
Если я использую тот же самый код, но вместо записи 5000 различных блоков повторяю одни и те же данные снова и снова (например, записываю 500 раз первые 10 блоков), среднее время записи становится менее 2 мс на файл — как будто файловая система каким-то образом способна оптимизировать запись, поскольку данные одни и те же.
Есть ли у кого-нибудь объяснение такому поведению?
Тестирование на Surface Pro 4 - процессор i5 с 8 ГБ ОЗУ, запись на встроенный твердотельный накопитель. Операционная система - 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
Версии Windows, начиная с Server 2012, поддерживают «дедупликацию» данных. Возможно, это включено в вашей системе, и если это так, то ОС обнаруживает дублирующие записи и выделяет «указатели» на общие данные файловой системы. Эффект этого будет заключаться в том, что NT будет обновлять только блоки каталогов и не будет выделять и записывать новые блоки файловой системы для дублирующихся файлов, что значительно сократит ввод-вывод.