Назад | Перейти на главную страницу

NTFS - вариации производительности при записи небольших файлов

У меня есть тестовый код, который генерирует список из 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 будет только обновлять блоки каталогов и не будет выделять и записывать новые блоки файловой системы для повторяющихся файлов, что значительно сокращает ввод-вывод.