Faux pas: "Швидкий" метод, про який я згадую нижче, не в 60 разів швидший, ніж повільний. Це в 30 разів швидше. Я буду звинувачувати помилку в годину (3:00 - це не найкращий час дня для чіткого мислення :) ..
Оновлення: я додав підсумок тестових разів (нижче).
Здається, що з коефіцієнтом швидкості є два питання:
- Вибір використовуваної команди (Порівняння часу показано нижче)
- Характер великої кількості файлів у каталозі ... Здається, що "великий - це погано". Речі стають непропорційно повільнішими, оскільки кількість збільшується.
Усі тести виконані з 1 мільйоном файлів.
(реальний, користувацький та sys час у тестових сценаріях)
Тестові сценарії можна знайти на paste.ubuntu.com
#
# 1 million files
# ===============
#
# |time |new dir |Files added in ASCENDING order
# +---- +------- +-------------------------------------------------
# real 01m 33s Add files only (ASCENDING order) ...just for ref.
# real 02m 04s Add files, and make 'rm' source (ASCENDING order)
# Add files, and make 'rm' source (DESCENDING order)
# real 00m 01s Count of filenames
# real 00m 01s List of filenames, one per line
# ---- ------- ------
# real 01m 34s 'rm -rf dir'
# real 01m 33s 'rm filename' via rm1000filesPerCall (1000 files per 'rm' call)
# real 01m 40s 'rm filename' via ASCENDING algorithm (1000 files per 'rm' call)
# real 01m 46s 'rm filename' via DESCENDING algorithm (1000 files per 'rm' call)
# real 21m 14s 'rm -r dir'
# real 21m 27s 'find dir -name "hello*" -print0 | xargs -0 -n 1000 rm'
# real 21m 56s 'find dir -name "hello*" -delete'
# real 23m 09s 'find dir -name "hello*" -print0 | xargs -0 -P 0 rm'
# real 39m 44s 'rm filename' (one file per rm call) ASCENDING
# real 47m 26s 'rm filename' (one file per rm call) UNSORTED
#
Нещодавно я створив та видалив 10 мільйонів порожніх тестових файлів. Видаляючи файли на основі імені (тобто rm filename
), я виявив важкий шлях, що існує величезна різниця у часі між двома різними методами ...
В обох методах використовується точно однакова rm filename
команда.
Оновлення: як виявляється, команди не були абсолютно однаковими ... Одна з них надсилала одночасно 1000 імен файлів до 'rm' ... Це було питання розширення дужки оболонки, де я думав, що пишеться кожне ім'я файлу до файлу фідера за власною лінією, але насправді це було 1000 на рядок
Назви фільмів надаються через "файл подачі" у while read
цикл.
Файл подачі є результатом ls -1 -f
Методи однакові у всіх повторах, за винятком одного:
- повільний метод використовує несортоване фідер файл прямо з
ls -1 -f
- швидкий метод використовує відсортоване версію того ж файлу несортовані
Я не впевнений, що це сортування в цьому питанні, чи, можливо, відсортований файл подачі просто відповідає послідовності, в якій були створені файли (я використовував простий алгоритм висхідного цілого числа)
Для 1 мільйона файлів швидкий rm filename
метод у 60 разів швидший, ніж повільний метод ... знову ж таки, я не знаю, чи це проблема "сортування", чи проблема закулісної хеш-таблиці ... Я підозрюю це не просте питання сортування, тому що чому б ls -1 -f
навмисно дати мені неординарний перелік щойно доданої "відсортованої" послідовності імен файлів ...
Мені просто цікаво, що тут відбувається, тому не потрібно мені днів (так днів), щоб видалити наступні 10 мільйонів файлів :) .... Я кажу "дні", тому що я спробував так багато альтернатив, і Час залучення збільшується непропорційно до файлу numberof, тому я протестував лише 1 мільйон у деталях
BTW: Видалення файлів через "відсортований список" імен насправді швидше, ніж rm -rf
в 2 рази,
і: rm -r
було в 30 разів повільніше, ніж метод "відсортований список"
... але чи "впорядковано" питання тут? або це більше пов'язано з хеширующим (або будь-яким іншим) способом зберігання, використовуваним ext4?
Що мене дуже спантеличує, це те, що кожен дзвінок не rm filename
має відношення до попереднього .. (ну, принаймні, саме так з точки зору "баш")
Я використовую привід Ubuntu / bash / 'ext4' / SATA II.
cat
у свіжому файлі до першого тесту - замість sort
до 2-го тесту.
find -delete
?