Usuwanie dużej liczby plików w systemie Windows jest powolne

34

Mam pudełko z systemem Windows XP z dyskiem NTFS i usuwanie dużych ilości plików jest bardzo wolne. Jeśli wybiorę folder zawierający dużą liczbę plików w drzewie folderów i usunę go (używając shift-del do zapisania kosza), zajmie to trochę czasu, który wydaje się być wprost proporcjonalny do liczby plików w folderze, zanim jeszcze wyskakuje okno potwierdzenia. Usunięcie każdego pliku w folderze zajmuje jeszcze więcej czasu.

Czy istnieje sposób na usunięcie folderu w systemie Windows, a czas nie jest proporcjonalny do liczby plików w nim zawartych?

Sindri Traustason
źródło

Odpowiedzi:

60

Czy istnieje sposób na usunięcie folderu w systemie Windows, a czas nie jest proporcjonalny do liczby plików w nim zawartych?

Nie sądzę, ale niektóre metody są wyraźnie szybsze niż inne.

Najgorszym sposobem jest wysłanie do Kosza: nadal musisz je usunąć. Kolejne najgorsze to shift + delete w Eksploratorze Windows: marnuje mnóstwo czasu na sprawdzanie zawartości przed rozpoczęciem usuwania czegokolwiek.

Następnym najlepszym rozwiązaniem jest użycie rmdir /s/q foldernamez wiersza poleceń. del /f/s/q foldernamejest również dobry, ale pozostawia strukturę katalogów.

Najlepsze, co znalazłem, to dwuwierszowy plik wsadowy z pierwszym przejściem do usuwania plików i wysyłania do nul, aby uniknąć narzutu pisania na ekranie dla każdego pojedynczego pliku. Drugie przejście następnie usuwa pozostałą strukturę katalogów:

del /f/s/q foldername > nul
rmdir /s/q foldername

Jest to prawie trzy razy szybsze niż pojedynczy plik rmdir, na podstawie testów czasowych z zaszyfrowanym dyskiem systemu Windows XP, usuwanie ~ 30 GB / 1 000 000 plików / 15 000 folderów: rmdirzajmuje ~ 2,5 godziny, del+rmdirzajmuje ~ 53 minut. Więcej informacji tutaj .

Jest to dla mnie normalne zadanie, więc zwykle przenoszę rzeczy, które muszę usunąć, do C: \ stufftodelete i mam te del+rmdirpolecenia w pliku wsadowym deletestuff.bat. To ma działać w nocy, ale czasami muszę go uruchomić w ciągu dnia, więc im szybciej, tym lepiej.

Hugo
źródło
> nul
Głosowanie
1
System Windows kazał mi czekać na przeskanowanie wielu tysięcy plików z kopii zapasowej starego zestawu SDK. Zajmie to co najmniej godzinę, w moim przypadku może to potrwać 10 minut. Umieściłem go w pliku nietoperza do ponownego użycia: gist.github.com/DavidEdwards/61d4d336232284b33b237b04da5bfe10
Knossos
Zobacz także tę samą odpowiedź z dodatkowymi informacjami na superuser.com/questions/19762/mass-deleting-files-in-windows
Warlike Chimpanzee
1

Czy istnieje sposób na usunięcie folderu w systemie Windows, a czas nie jest proporcjonalny do liczby plików w nim zawartych?

Tak, sformatuj partycję. Jestem trochę zaskoczony, że nikt nie sugerował tego w ciągu ostatnich 9 lat.

Jest to dość radykalne, ale jeśli spodziewasz się, że będziesz to robić często dla określonego folderu, może być warto utworzyć dla niego osobną partycję.


Jeśli to zbyt radykalne, pozostałe odpowiedzi są twoją jedyną nadzieją. Istnieje dobre wytłumaczenie przyczyny błędu serwera . Dotyczy to systemów plików Linux i XFS, ale tutaj obowiązuje ta sama logika. Nie można wiele poprawić we wbudowanych funkcjach systemu operacyjnego.

Jeśli jednak znasz ścieżki do wszystkich plików, które chcesz usunąć, możesz zapisywać na połączeniach, które zawierają zawartość katalogu i usuwać połączenia bezpośrednio, oszczędzając trochę narzutu. Nadal jednak proporcjonalny do liczby plików.

Osobiście lubię niektóre z raportów z postępu, aby upewnić się, że program nie umrze. Więc lubię usuwać rzeczy przez python. Na przykład, jeśli wszystkie pliki znajdują się w jednym katalogu bez podkatalogów:

import tqdm
import sys
import os

location = sys.argv[1]
directory = os.fsencode(location)

with os.scandir(directory) as it:
    for dir_entry in tqdm.tqdm(it):
        try:
            os.remove(dir_entry.path)
        except OSError:
            pass  # was not a file

Spowoduje to usunięcie około 250 plików / s na moim 12-letnim SEAGATE ST3250620NS. Zakładam, że na twoim dysku będzie znacznie szybciej.

Jednak w tym momencie jest to tylko mikrooptymalizacja, więc nie zrobi wiele, jeśli nie będziesz mieć milionów plików w jednym katalogu. (jak ja, lol, co ja zrobiłem D :)

FirefoxMetzger
źródło
0

Zainstaluj gnutools for windowsi uruchom:

find YOURFOLDER -type d -maxdepth 3 | xargs rm -Rf
bezużyteczny
źródło
0

Upewnij się, że nie tworzysz kopii zapasowej plików w chmurze i nie próbujesz ich jednocześnie usunąć!

W przypadku wielu rozwiązań do tworzenia kopii zapasowych w chmurze pliki zostaną zablokowane podczas tworzenia kopii zapasowej, a następnie musisz poczekać na ich utworzenie.

Jeśli masz ten problem, powiedzmy, że katalog tymczasowy (lub coś, co nie wymaga tworzenia kopii zapasowej), upewnij się, że katalog tymczasowy nie jest wybrany w zestawie kopii zapasowych.

Szymon, Szymek
źródło
0

Odkryłem, że foldery z kilkoma warstwami katalogów naprawdę spowalniają zdolność Windows do szybkiego ich usuwania. Pracowałem nad projektem, w którym dotarcie do folderu node_modules zajęło 5 poziomów, które zawsze można usunąć, nawet jeśli

del /f/s/q foldername > nul
rmdir /s/q foldername

W tej sytuacji przechodzę do folderu node_modules lub innego katalogu o najgłębszych poziomach i po prostu zaczynam wybierać i usuwać kilkanaście katalogów naraz. Jeśli pojawia się wiele operacji usuwania, wymusza to pracę Kosza w równoległych procesach, a nie w pojedynczym wątku, który, jak sądzę, używa, znacznie przyspiesza proces.

Gdy mój najgłębszy katalog jest pusty, idę o kilka poziomów wyżej i robię to samo. To zmniejszyło liczbę usunięć, które zajęły mi ponad godzinę do zaledwie kilku minut.

Jest to bardzo ręczny proces i prawdopodobnie można go napisać z pewnym sukcesem, ale to zadziałało dla mnie

TabsNotSpaces
źródło
0

Użyłem oryginalnej odpowiedzi Hugo, aby utworzyć plik .bat, którego używam podczas usuwania projektów NPM. Dodałem zmienną ścieżki i muszę tylko skopiować i wkleić ścieżkę. Kliknij dwukrotnie plik .bat i wykona całą pracę - nie musisz wpisywać wszystkiego.

set path="FOLDER_PATH"
del /f/s/q %path% > nul
rmdir /s/q %path%

Przykładowe użycie:

set path="C:\Projects\My React Project"
del /f/s/q %path% > nul
rmdir /s/q %path%
Zimorodek
źródło
-2

próbowałeś użyć wiersza polecenia

rmdir /s /q foldername

wszystkie operacje na dużych plikach w GUI są powolne - głównie dlatego, że wizualne sprzężenie zwrotne (pasek postępu) musi być wielokrotnie odświeżane

nEJC
źródło
5
To nonsens. Operacja może być powolna, ponieważ GUI musi zliczyć wszystkie pliki, aby oszacować wymagany czas, ale nie z powodu odmalowania.
Bender
źle ... Ciągle pracuję z dużymi folderami (głównie serwer win2k) i używam TotalCommander do przenoszenia / kopiowania / usuwania rzeczy. Zauważyłem, że jeśli zminimalizuję TC lub umieszczę inne okno aplikacji nad TC, rzeczy będą wykonywane co najmniej 50% szybciej. TC wciąż odmalowuje elementy wizualne, ale podczas komponowania wszystko jest ignorowane ...
nEJC
6
Czy Twój komputer jest tak wolny, że operacje GUI wpływają na wydajność We / Wy dysku? A może TotalCommander jest po prostu niesamowicie źle zakodowany? Dysk jest setki lub tysiące razy wolniejszy niż procesor, pamięć RAM i karta graficzna. Jeśli grafika spowalnia zapisy na dysku, masz poważne problemy.
Mr. Shiny and New 安 宇
1
Z tego powodu pytanie „nie wymagało czasu proporcjonalnego do liczby plików”. Nie szukam 50% szybciej.
Sindri Traustason
@Sindri Jeśli to zrobisz, w wierszu polecenia nie powinno być prawie żadnych opóźnień, zanim system zacznie działać. O ile rozumiem, to przetwarzanie wstępne jest tam, gdzie jest twój problem.
nEJC,