Назад | Перейти на главную страницу

Как переместить или удалить файлы из папки, содержащей 2 миллиона файлов, на диске NTFS?

Проблема в том, что любое изменение каталога блокирует проводник на неопределенный срок, хотя доступ Samba к другим каталогам по-прежнему работает. Я пробовал перемещать файлы локально и через Samba.

Даже перечисление каталога для получения списка файлов блокирует компьютер на неопределенный срок.

Я пробовал использовать Python win32file.FindFilesIterator для перебора файлов, но это тоже зависает.

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

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

Я установил эти два параметра для увеличения скорости, и они также не помогли решить проблему:

R:\>fsutil behavior query disablelastaccess
disablelastaccess = 1

R:\>fsutil behavior query disable8dot3
disable8dot3 = 1

Это все последовательные образы, которые могли бы привести к «ошибке» с именами файлов 8.3, в результате чего для многих файлов с одинаковыми именами в одном каталоге может потребоваться много времени, чтобы вычислить имена файлов 8.3. Насколько я понимаю, эти данные хранятся в файловой системе даже после включения disable8dot3, поэтому они все еще могут способствовать возникновению проблемы.

Любые идеи?

Я не знаю, сработает ли это, и если это практичный подход для вас, но как насчет того, чтобы поместить жесткий диск в компьютер с Linux и попробовать его с Linux?

(Существуют загрузочные Live CD для загрузки - вам даже не нужно физически перемещать жесткий диск).

В зависимости от того, как были добавлены файлы и насколько сильно фрагментирована папка, самым быстрым способом может быть даже удаление файлов, которые вы хотите сохранить, и уничтожение раздела!

Вам не следует делать двух вещей:

  1. Поместите столько файлов в одну папку
  2. Используйте проводник Windows для просмотра такой папки, не говоря уже о том, чтобы что-нибудь с ней сделать.

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

Краткосрочное решение - используйте вместо этого командную строку или какой-либо сценарий.

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

Вы можете немного изучить ahk или php. ahk было бы легче выучить, а кто-то http://webchat.freenode.net/?channels=#ahk вероятно, будут готовы помочь вам в чем-то собраться.

quick ex. from when I needed to do this...
Loop, C:\Users\PC\Web Sites\Folderwithtomanyfiles\*.htm, , 1  ; Recurse into subfolders.
{
Match :=
Match1 :=
name :=
name1 :=
M :=
File :=
total++
;the names of my files were each 7digits with some extra info I didn't want to share here so... 
RegExMatch(A_LoopFileFullPath, "Folderwithtomanyfiles\\(\d{7}.*?htm)", name)
RegExMatch(A_LoopFileFullPath, "Folderwithtomanyfiles\\(\d{7})", Match)
StringTrimLeft, Ma, Match1, 6
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 5
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 4
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 3
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 2
M .= Ma . "\"
StringTrimLeft, Ma, Match1, 1
M .= Ma
FileCreateDir, C:\Users\PC\Web Sites\fewer file names\%M%
FileAppend, %File%, C:\Users\PC\Web Sites\fewer file names\%M%\%name1%
created++
}
MsgBox Created %created% out of %total% 
}
;example of path ... 
;"C:\Users\PC\Web Sites\fewer file names\3\33\233\5233\35233\435233\0435233.htm
;turns out I should have put a few thousand files in each folder but oh well, hope the example helps. 

Попробуйте использовать PowerShell. Использование командлета Move-Item

HTH

Всегда есть cmd.exe и это del команда.

Вам нужно будет перезагрузиться, чтобы изменения FSUTIL вступили в силу, на всякий случай, если вы еще этого не сделали.

Общий порядок сложности для функций NTFS (Добавить, Удалить, Поиск) с отключенными именами 8.3 - O (Журнал N), поэтому практически все, что вы делаете, займет такое же время, как только что-то перейдет в это состояние.

Если у вас есть активный AV в системе, выключите его, пока вы это исправляете.

Из любопытства, можно ли повысить производительность, если копировать файлы кусками с помощью чего-то вроде Robocopy? Я подозреваю, что это не будет иметь большого значения, но это займет половину времени, которое занимает удаление (есть только поиск в каталоге, а не поиск, а затем удаление записи). Однако в конечном итоге у вас все еще будет проблема с удалением оригиналов.

используйте robocopy с параметром / mov

http://technet.microsoft.com/en-us/library/cc733145.aspx

Например, у меня была папка с 1,2 м почтовыми файлами, из-за которых проводник зависал. Файлы были названы, начиная с даты, поэтому я создавал папки для каждого месяца года, а затем использовал фильтрацию robocopy по дате в именах файлов.

robocopy e: \ sent-old \ e: \ sentmail \ 2013-4 201304 *. * / mov