Найти в Дзене
Holpa

Почему копирование 1000 файлов размером 1 МБ намного медленнее, чем копирование файла объемом 1 ГБ

На скорость копирования влияет множество факторов. Файловая система (NTFS, FAT32, HFS +, ext2 / ext3 / ext4, XFS, JFS, ReiserFS и btrfs) может препятствовать или ускорять процесс. Старые файловые системы являются однопоточными, что означает одну операцию копирования за раз вместо множества одновременных операций копирования. Другими факторами являются накладные расходы, такие как метаданные о файлах в файловой системе, требующие обновления, а также дорогостоящие операции журналирования или операции RAID на нескольких дисках, а также другие аппаратные издержки и т. д.

Диск всегда был узким местом производительности. Именно здесь за последнее время были достигнуты самые быстрые улучшения, когда SSD заменил традиционные металлические пластины с вращающейся ржавчиной и магнитными полями.

Основная причина того, что для многих маленьких файлов требуется больше времени, чем для одного большого файла, заключается в том, что они копируются по одному и завершают копирование до достижения максимальной скорости, а затем начинается копирование следующего файла. Такое копирование не достигает пиковой скорости. Но для копирования большого файла требуется больше времени, и поэтому копирование успевает достичь максимальную пиковую скорости и поддерживает её до завершения копирования.

Увеличение скорости показано на картинке ниже.

1000 файлов - это минимум 2000 операций синхронизации с буфером записи на диск, даже ближе к 6000, по сравнению от аций дного большого файла.

Кроме того, даже если каталог структурирован как B-дерево, каждое новое создание будет вызывать итерацию log2 (N), где N - глубина нового файла в дереве.

Обычно операции копирования этого стиля имеют тенденцию делать итерацию в глубину, что означает, что записи должны быть итерацией в ширину, но на практике это не может быть, ому вместо этого начальная итерация должна быть сначала шириной.

Обычно это не так, потому что позиционные данные каталога не передаются в пространство пользователя при обходе дерева каталогов.

Для операции массового копирования вы бы на самом деле хотели, чтобы флаг передавался в opendir (), чтобы вызвать итерацию в другом направлении, и это также потребовало бы изменения файловой системы.

-2

Если простым языком: хотя вы копируете (примерно) тот же объем данных, вы тратите дополнительные усилия на копирование файла не один раз, а тысячу раз. Это 999 дополнительных временных затрат, которые делают эту операцию намного медленнее.