Mam katalog zawierający miliony podkatalogów i tryliony plików. A teraz muszę to wyczyścić. Mówiąc bilion, nie mówię o rozmiarze pliku, ale o liczbie plików.
Próbowałem go usunąć za del/s
pomocą Eksploratora Windows. Żadne nie może wykonać zadania. Próbowałem usuwać niektóre podkatalogi jeden po drugim i zajęło mi to kilka dni. Problem, który napotkałem, polegał na tym, że za każdym razem, bez względu na użycie del
lub Eksploratora, widzę w Menedżerze zadań, że instancja eksploratora zużywa niebotyczną pamięć i stopniowo popycha mój system do awarii.
Nadal jest kilkaset milionów plików do usunięcia. Czy jest jakaś szansa na osiągnięcie jednego (lub kilku) poleceń / działań?
[EDYTOWANE]
Próbowałem zrobić to z Cygwin rm -fr
i przyniosłem ten sam wynik. Podsumowane jako:
Bez względu na użycie Eksploratora Windows,
DEL
z wiersza polecenia lubrm
polecenia Cygwin , pamięć systemowa stopniowo spada do zera, a pudełko ostatecznie się zawiesi.Jeśli w dowolnym momencie, przed awarią systemu, proces zostanie zamknięty (za pomocą CTRL + C lub cokolwiek innego), pudełko będzie nadal działać normalnie. Jednak cała wykorzystana pamięć NIE zostanie zwolniona. Powiedzmy, że zatrzymałem proces, podczas gdy pamięć systemowa osiąga 91%, Menedżer zadań mówi: Łącznie 4G RAM, pamięć podręczna to 329 MB i dostępne 335 MB. Następnie użycie pamięci pozostanie na tym poziomie, dopóki nie uruchomię ponownie komputera. Jeśli zatrzymam instancję eksploratora w Menedżerze zadań, ekran zgaśnie po włączeniu światła dysku twardego i nigdy nie wróci. Zwykle po zatrzymaniu instancji eksploratora w Menedżerze zadań mogę ponownie ją wywołać, naciskając Win + E lub automatycznie zrestartowano ją.
Naprawdę fajne zarządzanie pamięcią!
[EDYCJA PONOWNIE] Wygląda na to, że część użytej pamięci została zwolniona po dłuższej chwili, ale nie wszystkie. Część pamięci podręcznej i dostępnej wróciła w Menedżerze zadań. Nie czekałem już dłużej, nie jestem pewien, co się wtedy stanie.
źródło
Odpowiedzi:
Wyjaśnienie techniczne
Przyczyną problemów jest większość metod, ponieważ system Windows próbuje wyliczyć pliki i foldery. Nie stanowi to większego problemu w przypadku kilkuset - a nawet tysięcy - plików / folderów o głębokości kilku poziomów, ale jeśli masz biliony plików w milionach folderów sięgających dziesiątek poziomów, to z pewnością zapełni system. .
Załóżmy, że masz „tylko” 100 000 000 plików, a system Windows używa takiej prostej struktury do przechowywania każdego pliku wraz z jego ścieżką (w ten sposób unikniesz przechowywania każdego katalogu osobno, oszczędzając w ten sposób pewien narzut):
W zależności od tego, czy używa znaków 8-bitowych, czy znaków Unicode (używa Unicode) i czy twój system jest 32-bitowy czy 64-bitowy, wtedy będzie potrzebował od 25 GB do 49 GB pamięci do przechowywania listy (i jest to bardzo uproszczona struktura).
Powód, dla którego system Windows próbuje wyliczyć pliki i foldery przed ich usunięciem, różni się w zależności od metody, której używasz do ich usunięcia, ale robią to zarówno Eksplorator, jak i interpreter poleceń (możesz zauważyć opóźnienie po zainicjowaniu polecenia). Możesz także zobaczyć miganie aktywności dysku (dioda LED dysku twardego) podczas odczytywania drzewa katalogów z napędu.
Rozwiązanie
Najlepszym rozwiązaniem tego problemu jest skorzystanie z narzędzia do usuwania, które usuwa pliki i foldery pojedynczo, pojedynczo. Nie wiem, czy są na to gotowe narzędzia, ale to powinno być możliwe za pomocą prostego pliku wsadowego.
Spowoduje to sprawdzenie, czy argument został przekazany. Jeśli tak, to zmienia się na podany katalog (można go uruchomić bez argumentu, aby uruchomić w bieżącym katalogu lub podać katalog - nawet na innym dysku, aby miał się tam uruchomić).
Następnie usuwa wszystkie pliki w bieżącym katalogu. W tym trybie nie powinien niczego wyliczać i po prostu usuwać pliki bez zużywania dużej, jeśli w ogóle, pamięci.
Następnie wylicza foldery w bieżącym katalogu i wywołuje się, przekazując każdy folder do siebie (siebie), aby powrócić w dół.
Analiza
Powodem tego powinno być to, że nie wylicza każdego pojedynczego pliku i folderu w całym drzewie . W ogóle nie wylicza żadnych plików i tylko wylicza foldery w bieżącym katalogu (plus pozostałe w katalogach nadrzędnych). Zakładając, że w danym folderze znajduje się tylko kilkaset podkatalogów, nie powinno to być takie złe i na pewno wymaga znacznie mniej pamięci niż inne metody, które wyliczają całe drzewo.
Możesz zastanawiać się nad użyciem
/r
przełącznika zamiast (ręcznej) rekurencji. To nie zadziałałoby, ponieważ podczas gdy/r
przełącznik wykonuje rekurencję, wstępnie wylicza całe drzewo katalogów, czego dokładnie chcemy uniknąć; chcemy je usuwać bez przechodzenia.Porównanie
Porównajmy tę metodę z metodą (metodami) pełnego wyliczania.
Powiedziałeś, że masz „miliony katalogów”; powiedzmy 100 milionów. Jeśli drzewo jest w przybliżeniu zrównoważone i zakłada średnio około 100 podkatalogów na folder, to najgłębiej zagnieżdżony katalog byłby o około cztery poziomy niżej - w rzeczywistości w całym drzewie byłoby 101 010 100 podfolderów. (Zabawne, jak 100M może rozbić się do 100 i 4).
Ponieważ nie wyliczamy plików, musimy śledzić maksymalnie 100 nazw katalogów na poziom, dla maksymalnie
4 × 100 = 400
katalogów w danym momencie.Dlatego zapotrzebowanie na pamięć powinno wynosić ~ 206,25 KB, a więc w granicach dowolnego nowoczesnego (lub innego) systemu.
Test
Niestety (?) Nie mam systemu z bilionami plików w milionach folderów, więc nie jestem w stanie go przetestować (wydaje mi się, że na koniec liczyłem około 800 tysięcy plików), więc ktoś inny będzie musiał spróbować to.
Zastrzeżenie
Oczywiście pamięć nie jest jedynym ograniczeniem. Dysk będzie również dużym wąskim gardłem, ponieważ dla każdego usuwanego pliku i folderu system musi oznaczyć go jako wolny. Na szczęście wiele z tych operacji na dyskach zostanie połączonych razem (w pamięci podręcznej) i zapisanych we fragmentach zamiast osobno (przynajmniej dla dysków twardych, a nie dla nośników wymiennych), ale nadal będzie powodowało sporo wstrząsów podczas odczytywania systemu i zapisuje dane.
źródło
/r
przełącznika, to jak wyjaśniłem, spróbuje wyliczyć wszystkie pliki. Jeśli użyjesz/d
przełącznika, wyliczy on tylko foldery w bieżącym katalogu, więc jeśli nie masz miliarda folderów w bieżącym katalogu, nie powinno to powodować problemu.Nie mogę rozmawiać z bilionami plików, ale ostatnio nukowałem stary udział plików, który zawierał ~ 1,8 mln plików, używając:
„EmptyTMPFolder” to pusty katalog lokalny. opcja / MIR sprawi, że cel będzie wyglądał jak źródło (puste).
Prawdziwą korzyścią z tego podejścia była opcja ponownej próby (/ R: 30). To pozwoliło na pochłonięcie wszelkich problemów z łącznością, które mogą wystąpić podczas tego procesu. Lokalne usuwanie może nie przynieść korzyści w tym podejściu.
Nie mam konkretnych testów porównawczych, ale wolę to niż niektóre inne sugerowane opcje b / c opcji ponów / czekaj. Usunięcia rozpoczęły się niemal natychmiast.
źródło
Usunięcie wszystkich folderów zajmie dużo czasu i niewiele można na to poradzić. Możesz zapisać dane i sformatować dysk. Nie jest optymalny, ale zadziała (i szybko).
Inną opcją jest być może użycie dystrybucji Linuksa na płycie CD na żywo, którą można odczytać z partycji NTFS. Wiem z własnego doświadczenia, że
rm -rf folderName
może działać przez co najmniej 2 dni bez awarii systemu z 2 GB pamięci RAM. To potrwa chwilę, ale przynajmniej się skończy.źródło
Eee ... Nie chcę wiedzieć, jak stworzyłeś ich tak wiele.
To, co się dzieje, to Explorer próbuje wyliczyć każdy pojedynczy plik i zapisać informacje w pamięci, zanim rozpocznie się usuwanie. I oczywiście jest ich zdecydowanie za dużo.
Czy wypróbowałeś polecenie?
rmdir /s
? Tak długo, jak faktycznie usuwa pliki, które zostały znalezione, zamiast czekać na każdy z nich do wyliczenia, może działać.Ile jest poziomów podkatalogów? Jeśli jest tylko jeden lub inny niski numer, może działać szybki plik wsadowy, który ręcznie się powtarza.
Jednak każda metoda może chwilę potrwać.
źródło
rm -rf
działa. Działa to najlepiej w przypadku stosunkowo płytkich struktur katalogów. Nie jestem pewien, czyrmdir /s
to robi. To powinno .rmdir /?
:/s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
Innymi słowy,/s
flaga usuwa również pliki. Jak korzystałeśdel
? I tak, może być lepiej używaćrm -rf
zgodnie z sugestią soandos.Jedną z możliwych przyczyn takiego problemu jest cienkie przydzielanie, zwykle spotykane w środowiskach SAN. Niektóre dyski półprzewodnikowe mogą wykazywać ten sam problem. W takim przypadku ta zmiana konfiguracji może rozwiązać problem:
Należy pamiętać, że ta zmiana może mieć wpływ na wydajność dysków półprzewodnikowych i może uniemożliwić automatyczne i / lub ręczne ponowne czyszczenie dysków SAN.
źródło
Shift+ Deletepomija Kosz i może znacznie przyspieszyć.
Jeśli to nie zadziała (skrajne przypadki), wypróbuj Fast Folder Eraser i / lub Mass Directory Eraser
źródło
Prawdopodobnie Twój program antywirusowy / antymalware zużywa całą pamięć, a następnie powoduje awarię systemu.
Sam system Windows nie ma problemu z usunięciem dużej liczby plików, choć z pewnością jest wolniejszy niż podobna operacja w większości systemów plików innych niż Microsoft.
źródło
Problemem, na który możesz natknąć się, jest to, że katalog nie ulega kompaktowaniu po usunięciu pliku / folderu, więc jeśli masz folder z 1 milionem plików i usuniesz pierwsze 500k z nich. Na początku katalogu jest mnóstwo bloków, które są puste.
ALE, explorer i wiersz poleceń wciąż muszą przeglądać te bloki na wypadek, gdyby tam był plik. Coś, co może pomóc, to „przenieść” folder z jakiegoś miejsca w dół drzewa do nowego folderu z podstawy napędu, a następnie usunąć ten nowy folder. Przeniesienie folderu spowoduje jedynie przeniesienie wskaźnika do folderu, więc powinien on przejść szybko, a nie przenieść wszystkie znajdujące się pod nim pliki na nowe miejsce na dysku.
Inną rzeczą, którą możesz spróbować, jest użycie narzędzia innej firmy, takiego jak „PerfectDisk”, do kompaktowania folderów po usunięciu kilku plików.
źródło
Próbując różnych metod usuwania ponad 10 milionów plików dziennika syntezy, zauważyłem, że średnio około 30 000 plików można usunąć w ciągu 10 minut. Zajmie to około 55 godzin dla 10 milionów plików ...
Korzystając ze skryptu poniżej, szybkość usuwania wzrosła o ~ 75%. Listy plików są tworzone i wykonywane przez współbieżne procesy zwiększające operacje dyskowe (ale nie liniowo.) Pokazuję 4 widelce, ale dwa mogą wystarczyć.
Istnieje opcja użycia programu PowerShell, co znacznie skraca czas potrzebny na przygotowanie list.
BTW, testowałem przy użyciu dwóch bezpośrednich operacji usuwania pozwalających na kolizje, ale nie było zauważalnego skrócenia całkowitego czasu usuwania w porównaniu do pojedynczej operacji usuwania. I chociaż tworzenie list usuwania może być niepożądane, zaoszczędzony czas był tego wart.
źródło
Spróbuj tego i zmodyfikuj w razie potrzeby.
Jest to przetestowany skrypt na Win2003 na podstawie Synetech za wyjaśnienie techniczne i Analiza odpowiedziało 15 października '13 na 15:22
Testrun .. Istnieją foldery takie jak A1 do A4, B1 do B4 i C1 do C4 zagnieżdżone inaczej ..
Nie mogę komentować (strona narzeka na moją reputację), więc dodaję tutaj swój komentarz ..
Rozwiązanie Bjv tworzy bezużyteczne tymczasowe listy plików. A następnie powtarza je po raz drugi, aby wykonać rzeczywistą pracę. /superuser//a/892412/528695
Oryginalny skrypt Synetecha nie działał dla mnie. /superuser//a/416469/528695
Wyniki ..
źródło
Miałem podobne problemy dawno temu z zaledwie 10 milionami plików, ale na serwerze 2003, aby je usunąć, użyłem serwera / klienta ftp i zostawiłem klienta usuwając pliki i foldery. To powolne rozwiązanie, ale działa idealnie.
Prawdopodobnie będziesz miał drugi problem z MFT w NTFS, który nie ma rozwiązania, MFT to tablica, która w Windows 2003 (nie jestem pewien, czy Microsoft ma rozwiązanie po Windows 2003) przechowuje wszystkie pliki przyrostowo, więc z bilionem plików rozmiar będzie szalony, w moim przypadku MFT miał 17 milionów rekordów, a rozmiar MFT wynosił około 19 GB z zaledwie 45000 plików, testowałem w innych systemach i wygląda na 1 milion rekordów, które MFT będzie być około 1 GB.
Możesz sprawdzić status MFT za pomocą tego polecenia:
C:
- litera jednostkowa/a
- analizować/v
- gadatliwyKolejne trudne rozwiązanie, ponieważ nie ma narzędzia, które mogłoby zmniejszyć MFT, narzędzia po prostu wypełniają 0 nazwą plików i właściwości, ale nic więcej, ale możesz użyć konwertera VMware lub innego rodzaju P2V i stworzyć maszynę wirtualną na podstawie twój serwer, w ten sposób naprawisz wszystkie problemy związane z MFT, nigdy nie testowałem konwersji z V2P, teraz pracuję tylko w środowiskach wirtualnych, ale widziałem wiele informacji na ten temat w Internecie.
Ta wygrana w 2003 roku działa teraz doskonale, rozmiar MFT wynosi 40 MB i wszystko jest w porządku, jeśli chcesz, mogę powiedzieć ci więcej o kopiach zapasowych, defragmentacjach lub innych zadaniach związanych z milionami małych plików.
źródło
Zgodnie z tą odpowiedzią na StackOverflow użyj kombinacji
del
irmdir
:źródło
Ponieważ usuwanie wszystkich plików jednocześnie zajmuje zbyt dużo pamięci, potrzebujesz sposobu, aby je usunąć pojedynczo, ale z automatycznym procesem. Tego typu rzeczy są o wiele łatwiejsze do wykonania w powłoce uniksowej, więc użyjmy Cygwina. Poniższe polecenie generuje listę zwykłych plików, przekształca tę listę w sekwencję
rm
poleceń, a następnie podaje wynikowy skrypt do powłoki.Skrypt jest wykonywany nawet podczas generowania i nie ma żadnych pętli, więc powłoka nie musi (miejmy nadzieję) tworzyć żadnych dużych plików tymczasowych. To na pewno zajmie trochę czasu, ponieważ skrypt ma miliony linii. Być może będziesz musiał dostosować
rm
polecenie (być może powinienem był użyć-f
ale rozumiesz swoje pliki lepiej niż ja), aby działało.Teraz nie masz już nic oprócz katalogów. Oto, gdzie robi się brudno. Być może usunąłeś wystarczającą liczbę plików, abyś mógł zrobić to
rm -rf
bez braku pamięci (i prawdopodobnie będzie to szybsze niż inny skrypt). Jeśli nie, możemy dostosować odpowiedź Stackoverflow :Ponownie, poprawianie może być konieczne, tym razem z
sort
, aby uniknąć tworzenia dużych plików tymczasowych.źródło
Natknąłem się na ten sam problem jakiś czas temu. Napisałem małe narzędzie, które robi dokładnie to: rekurencyjnie usuwa katalog. Nie będzie wyliczał plików i nie zużywa dużo pamięci (O (n + m) na maksimum przy n = maksymalna głębokość katalogu i m = maksymalna liczba plików / katalogów w jednym z podkatalogów). Może obsługiwać długie ścieżki plików (> 256 znaków). Chciałbym uzyskać informację zwrotną, jeśli możesz rozwiązać ten problem.
Można go znaleźć tutaj: https://github.com/McNetic/fdeltree (plik wykonywalny w folderze wydań)
źródło
Znalazłem ten wątek, który szuka lepszego sposobu niż usunięcie ponad 3 milionów plików na kilku obsługiwanych serwerach. Powyższe są o wiele bardziej skomplikowane niż IMO, więc skończyłem na mojej znanej metodzie korzystania z narzędzia wiersza polecenia „FORFILES” w systemie Windows (było to na serwerze 2003).
W każdym razie poniżej znajduje się polecenie FORFILES, którego użyłem do usunięcia WSZYSTKICH plików w folderze z wiersza polecenia.
forfiles / P „TWOJA FOLDEROWA ŚCIEŻKA TUTAJ (np. C: \ Windows \ Temp)” / C ”cmd / c echo @file & del / f / q @file”
Powyższe również ECHO to nazwa plików, które są usuwane na ekran, ale tylko dlatego, że chciałem zobaczyć pewien postęp w tym, że faktycznie coś robi, jeśli nie powtórzysz czegoś, wygląda to tak, jakby okno DOS zawiesiło się, nawet choć działa zgodnie z oczekiwaniami.
Inicjacja zajmuje trochę czasu, tzn. Wygląda na to, że przez jakiś czas nic nie robi (około 30m dla ~ 3 milionów plików), ale ostatecznie powinieneś zobaczyć, jak nazwy plików zaczynają się pojawiać po ich usunięciu. Ta metoda zajmuje również dużo czasu, aby usunąć pliki (czas usuwania może być zostać skrócony bez echa?), Ale ostatecznie działa bez awarii komputera, na moich serwerach pliki używały ~ 1850 KB pamięci podczas procesu usuwania. .
Czas trwania usuwania może powodować problem, jeśli twoje serwery mają automatyczne wylogowanie, ponieważ musisz utrzymać mysz w ruchu (zaleciłbym uruchomienie jako użytkownik konsoli lub za pomocą narzędzia trzeciej części, takiego jak LanDesk lub SCCM itp. (Lub MouseJiggle). exe))
W każdym razie, pomyślałem, że podzielę się moją odpowiedzią, powodzenia wszystkim!
źródło