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