У меня был каталог, в котором было около 5 миллионов файлов. Когда я попытался запустить ls
команду из этого каталога, моя система заняла огромное количество памяти и через некоторое время зависла. Есть ли эффективный способ перечислить файлы, кроме использования ls
команды?
70
ls
этого использования--color
или-F
как это будет означать выполнениеlstat(2)
для каждого файла.ls
звонок или вы использовали опции?Ответы:
Избегайте сортировки с помощью:
Или, что эквивалентно:
источник
-1
флага может помочь.-1
занимает еще больше времени.-C
когда stdout является терминалом,-1
когда это канал), сбивает с толку. Когда вы экспериментируете и измеряете, вы переключаетесь между просмотром вывода (чтобы убедиться, что команда делает то, что вы ожидаете) и его подавлением (чтобы избежать мешающего фактора пропускной способности терминального приложения). Лучше использовать команды , которые ведут себя таким же образом в обоих режимах, так явно определить формат вывода через-1
,-C
,-l
и т.д.ls
на самом деле сортирует файлы и пытается перечислить их, что приводит к огромным накладным расходам, если мы пытаемся перечислить более миллиона файлов в каталоге. Как упомянуто в этой ссылке, мы можем использоватьstrace
или,find
чтобы перечислить файлы. Однако эти варианты также казались неосуществимыми для моей проблемы, поскольку у меня было 5 миллионов файлов. После некоторого поиска в Google, я обнаружил, что если мы перечислим использование каталоговgetdents()
, это должно быть быстрее, потому чтоls
,find
иPython
библиотеки используютreaddir()
медленнее, но используютgetdents()
снизу.Мы можем найти код C для просмотра списка файлов , используя
getdents()
от сюда :Скопируйте вышеуказанную C-программу в каталог, в котором должны быть перечислены файлы. Затем выполните следующие команды.
Пример синхронизации :
getdents
может быть намного быстрее, чемls -f
, в зависимости от конфигурации системы. Вот некоторые моменты, демонстрирующие увеличение скорости в 40 раз для вывода каталога, содержащего около 500 тыс. Файлов, по монтированию NFS в вычислительном кластере. Сначала каждая команда запускалась 10 раз подрядgetdents
, потомls -f
. Первый запуск выполняется значительно медленнее, чем все остальные, возможно, из-за ошибок страницы кэширования NFS. (Кроме того, над этим монтированиемd_type
поле ненадежно в том смысле, что многие файлы отображаются как «неизвестный» тип.)источник
ls
?getdents
противreaddir
упущены.Наиболее вероятной причиной , почему это медленный является тип файла окраски, вы можете избежать этого с
\ls
или/bin/ls
отключив параметры цвета.Если у вас действительно так много файлов в директории, использование
find
вместо этого также является хорошим вариантом.источник
ls -U --color
это займет много времени, так как это будетstat
каждый файл. Так что оба верны.ls
и по умолчанию имеет псевдонимы.bashrc
./bin/ls -U
и получил результат вЯ считаю, что это
echo *
работает намного быстрее, чем ls. YMMV.источник
*
. Так что этот путь, вероятно, все еще очень медленный для 5 миллионов файлов.