Чому копіювання однакової кількості даних займає більше часу, якщо вони розповсюджуються на багато окремих файлів?


11

Я помітив, що для копіювання даних на суму 24 Мб з однієї папки в іншу було потрібно близько 30 секунд, оскільки (я припускаю, що це причина), це було понад 1000 окремих файлів. Копіювання 24 Мб не повинно зайняти так довго. Чому кількість файлів відрізняється?

Я запускаю Windows 7 на MacBook (4 ГБ оперативної пам’яті, Intel (R) Core (TM) 2 Duo CPU P7450 @ 2,13 ГГц, 32-бітна операційна система)

EDIT: NTFS - це файлова система, що використовується на диску

Відповіді:


5

Жорсткий диск не має точної швидкості передачі, це залежить від правильного обслуговування, тобто не є фрагментарним, не має поганих секторів тощо ...

Якщо на жорсткому диску є SATA 2 і це той самий розділ, це лише швидкість передачі даних.

Якщо на одному HDD є два розділи, не потрібно, щоб ця передача даних між шиною та материнською платою, тобто вона завантажувалася в буфер. (тоді залежить від розміру буфера hdd.)

Але для кожного скопійованого файлу система повинна зберігати свій індекс у MFT HDD (Основна таблиця файлів), що робить процес копіювання повільніше, якщо ви копіюєте багато файлів. І якщо у вас є якийсь антивірус, він просканує кожен файл, який скопіюється. І якщо ви ввімкнули індексацію файлів пошуку Microsoft (або будь-яку іншу службу індексації файлів), результат буде гіршим.

Я думаю, що має бути багато інших причин, через які копіювання багатьох файлів відбувається повільніше, але вони повинні бути основними.


Відключення антивірусної програми зробило екстракт на 10 разів швидше. Після цього відсканували файли на наявність вірусів.
fat_mike

28

Чому кількість файлів відрізняється?

Мабуть, ви зосереджуєтесь виключно на аспекті "копіювати дані" "копіювати файл". Файл - це не просто дані; це сутність у файловій системі . Файл має ім'я, атрибути та дозволи. Вся ця додаткова інформація про файл повинна дублюватися разом із даними, коли "файл копіюється". Існує значна кількість вводу-виводу диска для виконання цієї файлової системи накладних витрат.

Процедура копіювання одного (1) файлу в загальну файлову систему буде приблизно такою:

  • Знайдіть вихідний файл у файловій системі. (а)
  • Прочитайте з диска запис каталогу для вихідного файлу.
  • Перевірте дозволи на читання.
  • Знайдіть файл призначення у файловій системі. (b)
  • Перевірте дозволи на запис у каталозі призначення.
  • Розгорніть каталог, якщо потрібно, щоб вмістити новий файл. (c)
  • Оновіть каталог на диску. (c1)
  • Знайдіть безкоштовні блоки, виділіть їх та оновіть таблицю ще раз. (г)
  • Прочитайте дані файлу та скопіюйте у файл призначення (тобто скопіюйте "файл").
  • Оновіть запис каталогу для нового файлу за допомогою (розмір та час). (е)
  • Оновіть час доступу до запису вихідного каталогу. (f)

(а) Принаймні це означає пошук поточного каталогу. Або шлях може починатися в корені файлової системи, і потрібно пройти кілька рівнів каталогів.

(b) Принаймні, це означає пошук поточного каталогу. Або шлях може починатися в корені файлової системи, і потрібно пройти кілька рівнів каталогів. Якщо файл призначення вже існує, то визначте, як копія має тривати або скасовуватись. Якщо файлу призначення не існує, слід створити нову запис каталогу, і, можливо, це передбачає розширення накладних даних про розподіл блоку файлів (він же кластер ).

(c) Якщо каталог потрібно розширити, виділіть новий блок шляхом пошуку вільного блоку, змініть таблицю розподілу з новим виділенням, а потім запишіть блоки (и) на диск. Оскільки більшість файлових систем підтримують декілька копій таблиці розподілу, то це означає кілька записів на диск.
(c1) Після того, як каталог призначення буде прочитаний , прочитайте блок каталогів з диска, змініть його новим записом каталогу для скопійованого файлу, а потім запишіть блок на диск.

(d) Щоб скопіювати файл, виділіть блоки, знайшовши вільні блоки, змініть таблицю розподілу за допомогою нових виділень, а потім запишіть блоки (и) на диск. Оскільки більшість файлових систем підтримують декілька копій таблиці розподілу, то це означає кілька записів на диск. Щоб зберегти цілісність даних, файлова система може не намагатися об'єднати (затримати і об'єднати) операції запису на диск для каталогів і таблиць розподілу, а скоріше виконати операції запису негайно, коли нові файли створюються та виділяються блоки.

(e) Після того, як копія даних буде завершена, оновіть новий запис каталогу для скопійованого файлу відповідною довжиною файлу та часовими позначками, а потім запишіть блок каталогів на диск.

(f) Оновіть запис у вихідному каталозі новою часовою позначкою "доступу", а потім запишіть блок каталогів на диск.

Отже, замість лише одного файлу, ваше питання задає питання, чи можна зробити все це для тисячі файлів часу, необхідного для простого копіювання частини даних файлів? Якщо ви скопіюєте лише один файл розміром 24 Мб, то вам буде з чим порівняти час копіювання тисячі файлів.

Під час створення резервної копії файлової системи копіювання окремих файлів в іншу файлову систему на диску або розділі використовується рідко, оскільки це досить повільний процес, як ви виявили. Більш швидкий метод - створити та записати єдиний архівний файл, який містить записи в вихідний каталог та вміст файлу у спеціальному файловому форматі; програми резервного копіювання та команда * nix 'tar' можуть виводити такий архівний файл. (Зауважте, що 'tar' просто обробляє архівні файли і не використовує стиснення, як утиліти архівації + стиснення.) Найшвидший метод резервного копіювання - запис на блоковий пристрій (а не файлову систему на пристрої), щоб джерельна файлова система була ігнорується (трактується як більше даних) і може бути виконана поодинока копія зображення пристрою-джерела.


-1

Ось концептуальна аналогія:

(будь ласка, пам’ятайте шановний Інтернет, що аналогії є помилковими. Не соромтесь вказувати, як у коментарях.)

Припущення:

  • Агент передачі інформації == якомусь малюкові, назвемо його Сем, переміщує яйця з одного кошика в інший кошик.
  • Я думаю, що середовище передачі інформації == . Тут не дуже важливо.
  • Яйця походять від різних видів, у тому числі ... динозаврів ... та міфічних підводних морських звірів та драконів. (яйця можуть бути справді великими)
  • Розмір файлу в розмірі == яєць. Подумайте, яйце робіна проти яйце дракона.

Аналогія:

Тож Сем повинен пересувати яйця з одного кошика в інший, тому що він працює на фермі, і той, хто дає йому завдання, - підлий. На цій фермі є різні яйценосні тварини, включаючи драконів та міфічних морських звірів; Сем вважає це приголомшливо з кількох причин. (Не дуже важливо, але це моя аналогія).
Сем - це чилін біля річки зі своїми двома кошиками, одна з кошиків - це одна з яйцями всередині неї. Яйця в кошику коливаються в розмірі від

  • яйце грабіна, яке займає, як 100 bytesмісце в кошику

до

  • Кракени-яйця, розміром навколо 2.7Gb.

Сем повинен почати рухати яйця, тому він просто починає хапати яйця і переміщувати їх. Скажімо, він вирішує спочатку перенести яйце-дракон. Зараз яйце надзвичайно масивне і щільне, тому йому потрібно трохи часу, щоб витягнути річ в інший кошик.
Сем забирає в іншу кошик яйце дракона, і він злий. Це було важко, бо річ займала стільки місця; переміщення його зайняло довго лише одне одне яйце.

Сем - дурень.

Сем повертається до свого першого кошика, щоб схопити ще одне яйце. Він розуміє, що у нього був справді один великий. Однак залишилось 100 000 000 000 яєць робіна.

Як бачимо, південь Сема розорений. Його природна схильність полягала б у тому, що дино-яйце повинно бути гірше, щоб йому довелося рухатися. Це має сенс, коли ми говоримо про яйця та кошики, але комп'ютери мають справу як 100 000 000 000.

Коротко:

Відповідь про те, чому для переміщення декількох невеликих файлів у порівнянні з кількома великими, потрібно стільки часу, пов'язана з вартістю, пов’язаною з дією їх переміщення. Чим більше у вас малих файлів, тим більше разів потрібно буде попередньо виконати дію. Іншим способом дивитися на це було б говорити про щільність інформації.


-2

Читайте FAT, переставляйте голови, відкривайте файл на зміну файлу - це все вимагає часу


Це привід NTFS
Trindaz

У NTFS всі дані файлу - ім'я файлу, дата створення, дозволи доступу та вміст - зберігаються як метадані в таблиці головних файлів. Таблиця головних файлів (MFT) містить метадані про кожен файл, каталог та метафайл на томі NTFS. Вона включає в себе назви файлів, розташування, розмір та дозволи. Запис у каталозі складається з імені файлу та "ідентифікатора файлу", який є номером запису, що представляє файл у головній таблиці файлів. Ідентифікатор файлу також містить кількість повторного використання для виявлення несвіжих посилань.
Ледачий борсук

Тож ваша відповідь на запитання ґрунтується на тому, що йому доведеться виконати стільки зайвих робіт, створюючи записи для імені файлу, місцезнаходження, розміру, дозволів тощо? Ось звідки береться вся зайва робота.
Trindaz

Створення нового та читання існуючого
Lazy Badger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.