У меня есть каталог, который содержит миллионы подкаталогов и триллионы файлов. И теперь я должен это очистить. Говоря триллион, я говорю не о размере файла, а о количестве файлов.
Я пытался удалить его с del/s
помощью и с помощью проводника Windows. Никто не может выполнить задачу. Я попытался удалить некоторые из подкаталогов один за другим, и это заняло у меня несколько дней. Проблема, с которой я столкнулся, заключалась в том, что каждый раз, независимо от того, используете del
ли вы проводник или проводник, я вижу в диспетчере задач, что экземпляр проводника потребляет неимоверную память и постепенно приводит к сбою системы.
Осталось удалить несколько сотен миллионов файлов. Есть ли возможность достичь одной (или несколькими) командами / действиями?
[Изменено]
Я пытался сделать это с Cygwin rm -fr
, и дал тот же результат. Суммируется как:
Независимо от того, используете ли вы проводник Windows,
DEL
из командной строки илиrm
команду Cygwin , объем системной памяти постепенно падает до нуля, и в конечном итоге окно падает.Если в какой-то момент, прежде чем система выйдет из строя, процесс будет закрыт (с помощью сочетания клавиш CTRL + C или чего-либо еще), окно продолжит работать в обычном режиме. Однако вся используемая память НЕ будет освобождена. Скажем, я остановил процесс, пока системная память достигает 91%, диспетчер задач сообщает: 4 ГБ ОЗУ всего, кэш-память 329 МБ и доступно 335 МБ. Тогда использование памяти останется на этом уровне, пока я не перезагружу машину. Если я остановлю экземпляр проводника в диспетчере задач, экран погаснет при включенном индикаторе жесткого диска и больше не вернется. Обычно, когда я останавливаю экземпляр проводника в диспетчере задач, я могу повторно вызвать его, нажав Win + E, или он был перезапущен автоматически.
Ну очень хорошее управление памятью!
[ИЗМЕНИТЬ СНОВА] Кажется, что некоторая часть использованной памяти действительно освободилась через некоторое время, но не все. Некоторая часть кэшированной и доступной памяти вернулась в диспетчере задач. Я больше не ждал, не уверен, что будет потом.
источник
Ответы:
Техническое объяснение
Причина, по которой большинство методов вызывают проблемы, заключается в том, что Windows пытается перечислить файлы и папки. Это не большая проблема с несколькими сотнями или даже тысячами файлов / папок глубиной в несколько уровней, но если у вас есть триллионы файлов в миллионах папок, идущие на десятки уровней глубины, то это определенно приведет к падению системы ,
Предположим, у вас есть «только» 100 000 000 файлов, и Windows использует простую структуру, подобную этой, для хранения каждого файла вместе с его путем (таким образом вы избегаете хранения каждого каталога по отдельности, тем самым сохраняя некоторые издержки):
В зависимости от того, использует ли он 8-разрядные символы или символы Unicode (он использует Unicode) и является ли ваша система 32-разрядной или 64-разрядной, для хранения списка потребуется от 25 до 49 ГБ памяти (и это очень упрощенная структура).
Причина, по которой Windows пытается перечислить файлы и папки перед их удалением, варьируется в зависимости от метода, который вы используете для их удаления, но это делают как Проводник, так и интерпретатор команд (вы можете увидеть задержку при запуске команды). Вы также можете увидеть, как мигает индикатор активности диска (HDD), когда он читает дерево каталогов с диска.
Решение
Лучше всего справляться с подобной ситуацией, используя инструмент удаления, который удаляет файлы и папки по отдельности, по одному за раз. Я не знаю, есть ли какие-либо готовые инструменты для этого, но это должно быть возможно сделать с помощью простого пакетного файла.
Для этого нужно проверить, был ли передан аргумент. Если это так, то он изменяется на указанный каталог (вы можете запустить его без аргумента, чтобы запустить в текущем каталоге или указать каталог - даже на другом диске, чтобы он начинался там).
Далее он удаляет все файлы в текущем каталоге. В этом режиме он не должен ничего перечислять и просто удалять файлы, не занимая много, если таковые имеются, памяти.
Затем он перечисляет папки в текущем каталоге и вызывает себя, передавая каждую папку ему (себе) для рекурсии вниз.
Анализ
Причина, по которой это должно работать, состоит в том, что он не перечисляет каждый отдельный файл и папку во всем дереве . Он не перечисляет файлы вообще, а только перечисляет папки в текущем каталоге (плюс остальные в родительских каталогах). Предполагая, что в любой данной папке есть только несколько сотен подкаталогов, тогда это не должно быть слишком плохо, и, конечно, требует намного меньше памяти, чем другие методы, которые перечисляют все дерево.
Вы можете задаться вопросом об использовании
/r
ключа вместо (ручной) рекурсии. Это не сработает, потому что, хотя/r
коммутатор выполняет рекурсию, он предварительно перечисляет все дерево каталогов, чего мы и хотим избежать; мы хотим удалить, как мы идем, не отслеживая.сравнение
Давайте сравним этот метод с методом полного перечисления.
Вы сказали, что у вас есть «миллионы каталогов»; скажем 100 миллионов. Если дерево приблизительно сбалансировано и предполагается, что в среднем около 100 подкаталогов на папку, то самый глубокий вложенный каталог будет примерно на четыре уровня ниже - на самом деле в целом дереве будет 101 010 100 подпапок. (Забавно, как 100M может сломаться до 100 и 4.)
Поскольку мы не перечисляем файлы, нам нужно отслеживать не более 100 имен каталогов на уровень, для максимального количества
4 × 100 = 400
каталогов в любой момент времени.Следовательно, требования к памяти должны составлять ~ 206,25 КБ, что находится в пределах любой современной (или иной) системы.
Тестовое задание
К сожалению (?) У меня нет системы с триллионами файлов в миллионах папок, поэтому я не могу ее протестировать (я считаю, по последним подсчетам, у меня было около ~ 800 КБ файлов), поэтому кому-то еще придется попробовать Это.
Предостережение
Конечно, память - не единственное ограничение. Диск также будет большим узким местом, потому что для каждого файла и папки, которую вы удаляете, система должна пометить его как свободный. К счастью, многие из этих дисковых операций будут объединены вместе (кэшированы) и записаны в виде кусков, а не по отдельности (по крайней мере, для жестких дисков, а не для съемных носителей), но это все равно будет вызывать небольшие колебания, когда система читает и пишет данные.
источник
/r
переключатель, то, как я объяснил, он попытается перечислить все файлы. Если вы используете/d
переключатель, он перечисляет только папки в текущем каталоге, поэтому, если у вас нет миллиарда папок в текущем каталоге, это не должно вызывать проблем.Я не могу говорить с триллионами файлов, но недавно я обстрелял старый общий ресурс, который содержал ~ 1,8 млн файлов, используя:
«EmptyTMPFolder» - это пустой локальный каталог. параметр / MIR сделает цель похожей на источник (пустой).
Настоящей выгодой для этого подхода была опция повтора (/ R: 30). Это дало возможность поглотить любые проблемы со связью, которые могут возникнуть во время этого процесса. Локальное удаление может не принести пользу этому подходу.
У меня нет конкретных тестов для сравнения времени, но я бы предпочел это по сравнению с некоторыми другими вариантами, предложенными b / c из вариантов повтора / ожидания. Удаление началось почти мгновенно.
источник
Удаление всех папок займет много времени, и с этим ничего не поделаешь. Что вы можете сделать, это сохранить ваши данные и отформатировать диск. Это не оптимально, но это будет работать (и быстро).
Другой вариант, возможно, использовать дистрибутив linux на live CD, который может читать из раздела NTFS. Я знаю по личному опыту, что
rm -rf folderName
может работать не менее 2 дней без сбоя системы с 2 ГБ оперативной памяти. Это займет некоторое время, но по крайней мере это закончится.источник
Хм .. Я не хочу знать, как вы создали так много.
Происходит следующее: Explorer пытается перечислить каждый файл и сохранить информацию в памяти, прежде чем он начнет удалять. И, очевидно, слишком много.
Вы пробовали команду
rmdir /s
? Пока он действительно удаляет файлы по мере их обнаружения, а не ожидает перечисления каждого из них, это может работать.Сколько существует уровней подкаталогов? Если есть только один или какой-то другой низкий номер, то может сработать быстрый пакетный файл, который вручную рекурсивно просматривается.
Любой метод займет некоторое время, хотя.
источник
rm -rf
делает. Это лучше всего работает с относительно мелкими структурами каталогов. Я не уверен, еслиrmdir /s
это делает. Он должен .rmdir /?
:/s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
Другими словами,/s
флаг также удаляет файлы. Как ты использовалdel
? И да, может быть, лучше просто использовать,rm -rf
как предложил Соандос.Одной из возможных причин проблемы, подобной этой, является тонкая подготовка, обычно встречающаяся в средах SAN. Некоторые твердотельные накопители могут демонстрировать ту же проблему. Если это так, это изменение конфигурации может решить вашу проблему:
Обратите внимание, что это изменение может повлиять на производительность твердотельных накопителей и может помешать автоматическому и / или ручному переосмыслению накопителей SAN.
источник
Shift+ Deleteпропускает корзину и может значительно ускорить процесс.
Если это не работает (крайние случаи), попробуйте Fast Folder Eraser и / или Mass Directory Eraser
источник
Вероятно, это ваш антивирус / вредоносное ПО, потребляющее всю память и затем сбивающее систему.
У самой Windows нет проблем с удалением огромного количества файлов, хотя она, безусловно, медленнее, чем аналогичная операция в большинстве файловых систем, не принадлежащих Microsoft.
источник
Проблема, с которой вы можете столкнуться, заключается в том, что каталог не уплотняется при удалении файла / папки, поэтому, если у вас есть папка с 1 миллионом файлов в ней, и удалите первые 500 КБ из них. В начале вашего каталога есть тонна блоков, которые, по сути, пустые.
НО, explorer и командная строка по-прежнему должны просматривать эти блоки на случай, если там есть файл. Что-то, что может помочь, - это «переместить» папку из какого-то места вниз по дереву в новую папку у основания диска, а затем удалить эту новую папку. Перемещение папки будет только перемещать указатель на папку, поэтому она должна идти быстро, а не перемещать все файлы в ней на новое место на диске.
Другая вещь, которую вы можете попробовать, - это использовать сторонние инструменты, такие как «PerfectDisk», для сжатия папок после удаления нескольких файлов.
источник
Пробуя различные подходы для удаления более 10 миллионов файлов журнала Fusion, я заметил, что в среднем около 30 тысяч файлов можно удалить за 10 минут. Это займет около 55 часов для 10 миллионов файлов ...
Используя приведенный ниже скрипт, уровень удаления увеличился на ~ 75%. Списки файлов создаются и выполняются параллельными процессами, увеличивающими дисковые операции (но не линейно). Я показываю 4 вилки, но двух может быть достаточно.
Существует возможность использовать PowerShell, что значительно сокращает время, необходимое для подготовки списков.
Кстати, я протестировал использование двух операций прямого удаления, допускающих коллизии, но не было заметного сокращения общего времени удаления по сравнению с одной операцией удаления. И хотя создание списков удаления может быть нежелательным, сэкономленное время того стоило.
источник
Попробуйте это и измените, как вам нужно ..
Это проверенный скрипт на Win2003, основанный на техническом объяснении и анализе Synetech, ответили 15 октября 13 в 15:22
Testrun .. Есть папки, такие как А1-А4, В1-В4 и С1-С4, вложенные по-разному.
Я не могу комментировать (сайт жалуется на мою репутацию), поэтому я добавляю свой комментарий здесь ..
Решение Bjv создает бесполезные временные списки файлов. И затем повторяет их во второй раз, чтобы сделать реальную работу. /superuser//a/892412/528695
Оригинальный сценарий Synetech не работал для меня. /superuser//a/416469/528695
Результаты..
источник
У меня были похожие проблемы с 10 миллионами файлов, но на сервере 2003, чтобы удалить файлы, я использовал ftp сервер / клиент и оставил клиент, удаляя файлы и папки. Это медленное решение, но оно прекрасно работает.
Вероятно, у вас будет вторая проблема с MFT в NTFS, у которой нет решения, MFT - это массив, который в win 2003 (я не уверен, есть ли у Microsoft решение после win 2003) хранит все файлы в пошаговом режиме, поэтому с триллионом файлов размер будет сумасшедшим, в моем случае у MFT было 17 миллионов записей, а размер MFT составлял около 19 ГБ, а всего 45000 файлов. Я тестировал в других системах, и похоже, что для 1 миллиона записей MFT будет быть около 1 ГБ.
Вы можете проверить состояние MFT с помощью этой команды:
C:
- единичное письмо/a
- анализировать/v
- подробныйДругое хитрое решение, так как не существует инструмента, который может сжимать MFT, инструменты просто заполняют 0 именами файлов и свойств, но не более того, но вы можете использовать конвертер VMware или другой тип P2V и создать виртуальную машину на основе Ваш сервер, таким образом, вы исправите все проблемы, связанные с MFT, я никогда не тестировал конвертацию из V2P, сейчас я работаю только в виртуальных средах, но я видел много информации об этом в Интернете.
Эта win 2003 теперь работает отлично, размер MFT составляет 40 МБ, и все в порядке, если вы хотите, я могу рассказать вам больше о резервных копиях, дефрагментации или других задачах, связанных с миллионами крошечных файлов.
источник
Для этого ответа на StackOverflow используйте комбинацию
del
иrmdir
:источник
Поскольку одновременное удаление файлов занимает слишком много памяти, вам нужен способ их удаления по одному, но с автоматизированным процессом. Такого рода вещи намного проще сделать в оболочке в стиле Unix, поэтому давайте использовать Cygwin. Следующая команда генерирует список обычных файлов, преобразует этот список в последовательность
rm
команд, а затем передает полученный сценарий в оболочку.Сценарий выполняется даже во время его генерации, и в нем нет циклов, поэтому оболочке (надеюсь) не нужно создавать большие временные файлы. Это, безусловно, займет некоторое время, поскольку длина сценария составляет миллионы строк. Возможно, вам придется настроить
rm
команду (возможно, мне следовало использовать-f
? Но вы понимаете свои файлы лучше меня), чтобы заставить ее работать.Теперь у вас ничего не осталось, кроме каталогов. Вот где вещи становятся дикими. Возможно, вы удалили достаточно файлов, чтобы обойтись
rm -rf
без нехватки памяти (и, вероятно, это будет быстрее, чем другой сценарий). Если нет, мы можем адаптировать ответ Stackoverflow :Опять же, может потребоваться настройка, на этот раз
sort
, чтобы избежать создания огромных временных файлов.источник
Я столкнулся с той же проблемой некоторое время назад. Я написал небольшую утилиту, которая делает именно это: рекурсивно удаляет каталог. Он не будет перечислять файлы и не будет занимать много памяти (O (n + m) на максимуме с n = максимальной глубиной каталога и m = максимальным количеством файлов / каталогов в одном из подкаталогов). Он может обрабатывать длинные пути к файлам (> 256 символов). Я хотел бы получить обратную связь, если вы можете решить эту проблему с этим.
Вы можете найти его здесь: https://github.com/McNetic/fdeltree (исполняемый файл в папке релизов)
источник
Я обнаружил, что этот поток ищет лучший способ удаления более 3 миллионов файлов на нескольких серверах, которые я поддерживаю. Вышесказанное является слишком сложным IMO, поэтому я использовал свой известный метод использования инструмента командной строки «FORFILES» в Windows (это было на Server 2003).
В любом случае, ниже приведена команда FORFILES, которую я использовал для удаления ВСЕХ файлов в папке из командной строки.
forfiles / P "ПУТЬ ВАШЕЙ ПАПКИ ЗДЕСЬ (например, C: \ Windows \ Temp)" / C "cmd / c echo @file & del / f / q @file"
Выше также ECHO - это имя файлов, которые удаляются на экран, но только потому, что я хотел видеть некоторый прогресс в том, что он действительно что-то делает, если вы не выводите что-то, просто выглядит окно DOS, даже хотя он работает нормально, как и ожидалось.
Инициирование занимает некоторое время, то есть похоже, что какое-то время ничего не происходит (около 30 м для ~ 3 млн. Файлов), но в конечном итоге вы должны увидеть, что имена файлов начинают появляться по мере их удаления. Этот метод также занимает много времени для удаления файлов (время удаления может быть сокращено без эха?), Но в конечном итоге он работает без сбоя компьютера, на моих файловых серверах использовалось ~ 1850 КБ памяти во время процесса удаления. ,
Продолжительность удаления может вызвать проблему, если на ваших серверах есть автоматический выход из системы, поскольку вам нужно держать мышь движущейся (я бы порекомендовал работать как пользователь консоли, или с помощью инструмента третьей части, такого как LanDesk или SCCM и т. Д. (Или MouseJiggle). исполняемый файл))
Во всяком случае, думал, что я поделюсь своим ответом, удачи всем!
источник