Ich habe ein Verzeichnis, das Millionen von Unterverzeichnissen und Billionen von Dateien enthält. Und jetzt muss ich es klären. Ich spreche nicht von der Dateigröße, sondern von der Anzahl der Dateien.
Ich habe versucht, es mit zu löschen del/s
und Windows Explorer zu verwenden. Keiner kann die Aufgabe abschließen. Ich habe versucht, einige der Unterverzeichnisse einzeln zu löschen, und das hat Tage gedauert. Das Problem, auf das ich gestoßen bin, war, dass del
ich im Task-Manager jedes Mal, unabhängig von der Verwendung von oder dem Explorer, feststellen kann, dass die Explorer-Instanz himmelhohen Speicher belegt und mein System nach und nach zum Absturz bringt.
Es müssen noch einige hundert Millionen Dateien gelöscht werden. Gibt es eine Möglichkeit, mit einem (oder wenigen) Befehlen / Aktionen etwas zu erreichen?
[EDITED]
Ich habe es mit Cygwin rm -fr
versucht und das gleiche Ergebnis erzielt . Zusammengefasst als:
DEL
Unabhängig davon, ob Sie den Windows Explorer über die Eingabeaufforderung oder den Cygwin-rm
Befehl verwenden, wird der Systemspeicher allmählich auf Null reduziert und die Box stürzt schließlich ab.Wenn zu irgendeinem Zeitpunkt, bevor das System ausfällt, der Prozess geschlossen wird (mit STRG + C oder was sonst), funktioniert die Box wie gewohnt weiter. Der gesamte verwendete Speicher wird jedoch NICHT freigegeben. Angenommen, ich habe den Prozess angehalten, während der Systemspeicher 91% erreicht. Der Task-Manager gibt an: 4 GB RAM insgesamt, der Cache 329 MB und die verfügbare Kapazität 335 MB. Dann bleibt die Speichernutzung auf diesem Niveau, bis ich den Computer neu starte. Wenn ich die Explorer-Instanz im Task-Manager stoppe, wird der Bildschirm bei eingeschalteter Festplattenanzeige immer dunkel und kommt nie wieder. Normalerweise kann ich die Explorer-Instanz im Task-Manager durch Drücken von Win + E erneut aufrufen oder sie wurde automatisch neu gestartet.
Na ja, wirklich schönes Speichermanagement!
[WIEDER BEARBEITEN] Es scheint, dass ein Teil des verwendeten Speichers nach einer langen Zeit freigegeben wurde, aber nicht alle. Ein Teil des zwischengespeicherten und verfügbaren Speichers wurde im Task-Manager wiederhergestellt. Ich habe nicht länger gewartet und bin mir nicht sicher, was dann passieren wird.
quelle
Antworten:
Technische Erklärung
Die meisten Methoden verursachen Probleme, weil Windows versucht, die Dateien und Ordner aufzulisten. Bei ein paar hundert oder sogar tausend Dateien / Ordnern mit einer Tiefe von einigen Ebenen ist dies kein großes Problem. Wenn Sie jedoch Billionen von Dateien in Millionen von Ordnern haben, die Dutzende von Ebenen tief gehen, wird dies das System definitiv zum Erliegen bringen .
Sie haben "nur" 100.000.000 Dateien, und Windows verwendet eine einfache Struktur wie diese, um jede Datei zusammen mit ihrem Pfad zu speichern.
Abhängig davon, ob 8-Bit-Zeichen oder Unicode-Zeichen (Unicode) verwendet werden und ob Ihr System 32-Bit- oder 64-Bit-Speicher ist, werden zwischen 25 GB und 49 GB Arbeitsspeicher zum Speichern der Liste benötigt (und dies ist sehr wichtig) vereinfachte Struktur).
Der Grund, warum Windows versucht, die Dateien und Ordner vor dem Löschen aufzulisten, hängt von der Methode ab, mit der Sie sie löschen. Dies geschieht jedoch sowohl im Explorer als auch im Befehlsinterpreter (es kann eine Verzögerung auftreten, wenn Sie den Befehl einleiten). Sie können auch sehen, wie die Festplattenaktivität (HDD-LED) blinkt, während der Verzeichnisbaum vom Laufwerk gelesen wird.
Lösung
In solchen Situationen sollten Sie am besten ein Löschtool verwenden, das die Dateien und Ordner einzeln nacheinander löscht. Ich weiß nicht, ob es dafür fertige Tools gibt, aber es sollte möglich sein, dies mit einer einfachen Batch-Datei zu erreichen.
Dies überprüft, ob ein Argument übergeben wurde. In diesem Fall wechselt es in das angegebene Verzeichnis (Sie können es ohne Argument ausführen, um im aktuellen Verzeichnis zu starten, oder ein Verzeichnis angeben - auch auf einem anderen Laufwerk, damit es dort startet).
Als nächstes werden alle Dateien im aktuellen Verzeichnis gelöscht. In diesem Modus sollte es nichts aufzählen und die Dateien einfach löschen, ohne viel, wenn überhaupt, Speicherplatz in Anspruch zu nehmen.
Dann zählt es die Ordner im aktuellen Verzeichnis auf und ruft sich selbst auf, wobei es jeden Ordner an sich selbst weiterleitet, um abwärts zu rekursieren.
Analyse
Der Grund, warum dies funktionieren sollte , ist, dass nicht jede einzelne Datei und jeder einzelne Ordner in der gesamten Struktur aufgelistet wird . Es werden überhaupt keine Dateien aufgelistet und nur die Ordner im aktuellen Verzeichnis (sowie die übrigen in den übergeordneten Verzeichnissen). Angenommen, es gibt nur ein paar hundert Unterverzeichnisse in einem bestimmten Ordner, dann sollte dies nicht allzu schlimm sein und mit Sicherheit viel weniger Speicher als bei anderen Methoden, die den gesamten Baum auflisten.
Möglicherweise möchten Sie den
/r
Schalter anstelle der (manuellen) Rekursion verwenden. Das würde nicht funktionieren, da der/r
Switch zwar eine Rekursion durchführt, aber den gesamten Verzeichnisbaum vorab auflistet, was genau das ist, was wir vermeiden wollen. Wir möchten löschen, ohne den Überblick zu behalten.Vergleich
Vergleichen wir diese Methode mit der (den) Methode (n) mit vollständiger Aufzählung.
Sie hatten gesagt, Sie hätten "Millionen von Verzeichnissen"; Sagen wir 100 Millionen. Wenn der Baum ungefähr ausgeglichen ist und ein Durchschnitt von etwa 100 Unterverzeichnissen pro Ordner angenommen wird, wäre das tiefste verschachtelte Verzeichnis etwa vier Ebenen tiefer - tatsächlich gibt es 101.010.100 Unterverzeichnisse im gesamten Baum. (Amüsant, wie 100M auf nur 100 und 4 herunterbrechen können.)
Da wir keine Dateien auflisten, müssen wir nur maximal 100 Verzeichnisnamen pro Ebene für maximal
4 × 100 = 400
Verzeichnisse zu einem bestimmten Zeitpunkt nachverfolgen.Aus diesem Grund sollte der Speicherbedarf ~ 206,25 KB betragen und innerhalb der Grenzen eines modernen (oder anderen) Systems liegen.
Prüfung
Leider (?) Habe ich kein System mit Billionen von Dateien in Millionen von Ordnern, daher kann ich es nicht testen (ich glaube, zuletzt hatte ich ungefähr 800.000 Dateien), also muss es jemand anderes versuchen es.
Vorbehalt
Natürlich ist der Speicher nicht die einzige Einschränkung. Das Laufwerk stellt auch einen großen Engpass dar, da das System für jede gelöschte Datei und jeden Ordner diese als frei markieren muss. Zum Glück werden viele dieser Festplattenvorgänge gebündelt (zwischengespeichert) und nicht einzeln, sondern in Blöcken geschrieben (zumindest für Festplatten, nicht für Wechselmedien), aber es wird immer noch einiges an Thrashing verursachen, während das System liest und schreibt die Daten.
quelle
/r
Schalter verwendet haben, wird er, wie bereits erläutert, versuchen, alle Dateien aufzulisten. Wenn Sie den/d
Schalter verwenden, werden nur die Ordner im aktuellen Verzeichnis aufgelistet. Wenn Sie also nicht über eine Milliarde Ordner im aktuellen Verzeichnis verfügen, sollte dies kein Problem verursachen.Ich kann nicht mit den Billionen von Dateien sprechen, aber ich habe kürzlich eine alte Dateifreigabe mit ~ 1,8 Millionen Dateien überarbeitet:
"EmptyTMPFolder" ist ein leeres lokales Verzeichnis. Mit der Option / MIR sieht das Ziel wie die Quelle aus (leer).
Der eigentliche Vorteil dieses Ansatzes war die Wiederholungsoption (/ R: 30). Dies ermöglichte die Übernahme von Verbindungsproblemen, die während dieses Vorgangs auftreten können. Lokale Löschvorgänge haben bei diesem Ansatz möglicherweise keinen Nutzen.
Ich habe keine spezifischen Benchmarks, um die Zeiten zu vergleichen, aber ich würde dies einigen anderen Optionen vorziehen, die in den Optionen zum erneuten Versuch / Warten vorgeschlagen werden. Die Löschvorgänge begannen fast augenblicklich.
quelle
Das Löschen aller Ordner nimmt viel Zeit in Anspruch, und Sie können nicht viel dagegen tun. Sie können Ihre Daten speichern und Ihr Laufwerk formatieren. Es ist nicht optimal, aber es wird funktionieren (und zwar schnell).
Eine andere Möglichkeit ist vielleicht die Verwendung einer Linux-Distribution auf einer Live-CD, die von einer NTFS-Partition lesen kann. Ich weiß aus eigener Erfahrung, dass
rm -rf folderName
mindestens 2 Tage ausgeführt werden können, ohne ein System mit 2 GB RAM zum Absturz zu bringen. Es wird eine Weile dauern, aber zumindest wird es enden.quelle
Ähm ... ich will nicht wissen, wie du so viele erschaffen hast.
Der Explorer versucht, jede einzelne Datei aufzulisten und die Informationen im Speicher zu speichern, bevor sie gelöscht werden. Und es gibt offensichtlich viel zu viele.
Hast du den Befehl ausprobiert
rmdir /s
? Solange die gefundenen Dateien tatsächlich gelöscht werden und nicht auf jede einzelne Aufzählung gewartet wird, funktioniert dies möglicherweise.Wie viele Unterverzeichnisse gibt es? Wenn es nur eine oder eine andere niedrige Zahl gibt, funktioniert möglicherweise eine schnelle Batch-Datei, die manuell durchlaufen wird.
Jede Methode wird jedoch eine Weile dauern.
quelle
rm -rf
. Das funktioniert am besten mit relativ flachen Verzeichnisstrukturen. Ich bin mir nicht sicher, obrmdir /s
das so ist. Es sollte .rmdir /?
:/s Removes all directories and files in the specified directory in addition to the directory itself. Used to remove a directory tree.
Mit anderen Worten, das/s
Flag entfernt auch Dateien. Wie hast du benutztdel
? Und ja, es könnte besser sein, es einfach so zu verwenden,rm -rf
wie es die anderen vorgeschlagen haben.Eine mögliche Ursache für ein solches Problem ist die Thin-Bereitstellung, die normalerweise in SAN-Umgebungen auftritt. Einige Solid-State-Laufwerke weisen möglicherweise dasselbe Problem auf. In diesem Fall könnte diese Konfigurationsänderung Ihr Problem lösen:
Beachten Sie, dass diese Änderung die Leistung von Solid-State-Laufwerken beeinträchtigen und ein automatisches und / oder manuelles Überdenken von SAN-Laufwerken verhindern kann.
quelle
Shift+ Deleteüberspringt den Papierkorb und beschleunigt möglicherweise die Arbeit erheblich.
Wenn dies nicht funktioniert (Extremfälle), versuchen Sie es mit Fast Folder Eraser und / oder Mass Directory Eraser
quelle
Wahrscheinlich verbraucht Ihre Antiviren- / Antimalware den gesamten Speicher und stürzt dann das System ab.
Windows selbst hat kein Problem damit, eine große Anzahl von Dateien zu löschen, obwohl dies auf den meisten Nicht-Microsoft-Dateisystemen langsamer ist als ein ähnlicher Vorgang.
quelle
Ein Problem, auf das Sie möglicherweise stoßen, besteht darin, dass das Verzeichnis beim Löschen einer Datei / eines Ordners nicht komprimiert wird. Wenn Sie also einen Ordner mit 1 Million Dateien haben und die ersten 500.000 Dateien löschen, wird der Ordner möglicherweise nicht komprimiert. Es gibt eine Menge Blöcke am Anfang Ihres Verzeichnisses, die für alle Fälle leer sind.
ABER der Explorer und eine Eingabeaufforderung müssen diese Blöcke noch durchsuchen, nur für den Fall, dass dort eine Datei vorhanden ist. Etwas, das helfen könnte, ist, einen Ordner von irgendwo in der Baumstruktur in einen neuen Ordner von der Basis des Laufwerks zu "verschieben" und dann diesen neuen Ordner zu löschen. Durch das Verschieben des Ordners wird nur der Zeiger auf den Ordner verschoben, sodass dieser schnell verschoben werden kann und nicht alle Dateien auf dem Laufwerk an einen neuen Speicherplatz verschoben werden.
Sie können auch versuchen, ein Drittanbieter-Tool wie "PerfectDisk" zum Komprimieren von Ordnern nach dem Löschen einer Reihe von Dateien zu verwenden.
quelle
Beim Versuch, über 10 Millionen Fusionsprotokolldateien auf verschiedene Weise zu löschen, stellte ich fest, dass durchschnittlich 30.000 Dateien innerhalb von 10 Minuten gelöscht werden konnten. Das würde ungefähr 55 Stunden für die 10 Millionen Dateien dauern ...
Mit dem folgenden Skript wurde die Löschrate um ~ 75% erhöht. Dateilisten werden durch gleichzeitige Prozesse erstellt und ausgeführt, wodurch die Datenträgeroperationen erhöht werden (aber nicht linear). Ich zeige 4 Gabeln, aber zwei könnten ausreichen.
Es besteht die Möglichkeit, PowerShell zu verwenden, wodurch sich der Zeitaufwand für die Erstellung der Listen erheblich verringert.
Übrigens habe ich zwei direkte Löschoperationen getestet, die Kollisionen zulassen, aber es gab keine merkliche Verringerung der Gesamtlöschzeit im Vergleich zu einer einzelnen Löschoperation. Und obwohl es möglicherweise nicht wünschenswert ist, Löschlisten zu erstellen, hat sich die Zeitersparnis gelohnt.
quelle
Probieren Sie dies aus und ändern Sie es nach Bedarf.
Es handelt sich um ein getestetes Skript für Win2003, das auf Synetechs technischer Erklärung und Analyse basiert und am 15. Oktober 13 um 15:22 Uhr beantwortet wurde
Testlauf .. Es sind Ordner wie A1 bis A4, B1 bis B4 und C1 bis C4 unterschiedlich verschachtelt ..
Ich kann keinen Kommentar abgeben (Website beschwert sich über meinen Ruf), daher füge ich meinen Kommentar hier hinzu.
Bjvs Lösung erstellt nutzlose temporäre Dateilisten. Und wiederholt sie dann zum zweiten Mal, um die eigentliche Arbeit zu erledigen. /superuser//a/892412/528695
Das ursprüngliche Skript von Synetech hat bei mir nicht funktioniert. /superuser//a/416469/528695
Ergebnisse..
quelle
Ich hatte vor einiger Zeit ähnliche Probleme mit nur 10 Millionen Dateien, aber in einem Server 2003, um die Dateien zu löschen, benutzte ich einen FTP-Server / Client und ließ den Client die Dateien und Ordner löschen. Es ist eine langsame Lösung, aber es funktioniert perfekt.
Wahrscheinlich haben Sie ein zweites Problem mit der MFT in NTFS, das keine Lösung hat. Die MFT ist ein Array, das in Windows 2003 (ich bin nicht sicher, ob Microsoft nach Windows 2003 eine Lösung hat) alle Dateien inkrementell speichert mit Billionen von Dateien wird die Größe verrückt sein, in meinem Fall hatte die MFT 17 Millionen Datensätze und die Größe der MFT lag bei etwa 19 GB mit nur 45000 Dateien, ich habe sie in anderen Systemen getestet und für 1 Million Datensätze sieht die MFT aus etwa 1 GB sein.
Sie können den Status der MFT mit diesem Befehl überprüfen:
C:
- Einheitsbrief/a
- analysieren/v
- ausführlichEine andere knifflige Lösung, da es kein Tool gibt, das die MFT verkleinern kann, füllen die Tools nur den Namen der Dateien und Eigenschaften mit 0, aber nichts weiter, sondern Sie können VMware Converter oder eine andere Art von P2V verwenden und eine virtuelle Maschine basierend auf erstellen Ihr Server, auf diese Weise werden Sie alle Probleme im Zusammenhang mit der MFT beheben, ich habe die Konvertierung von V2P nie getestet, jetzt arbeite ich nur in virtuellen Umgebungen, aber ich habe viele Informationen darüber im Internet gesehen.
Dieser Sieg 2003 funktioniert jetzt perfekt, die Größe der MFT beträgt 40 MB und alles ist in Ordnung. Wenn Sie möchten, kann ich Ihnen mehr über Backups, Defragmentierungen oder andere Aufgaben im Zusammenhang mit Millionen winziger Dateien erzählen.
quelle
Per dieser Antwort auf Stackoverflow verwendet eine Kombination aus
del
undrmdir
:quelle
Da das Löschen der Dateien auf einmal zu viel Speicherplatz beansprucht, müssen Sie sie einzeln löschen, wobei der Vorgang jedoch automatisiert wird. Diese Art von Dingen ist in einer Unix-artigen Shell viel einfacher zu machen, also lasst uns Cygwin benutzen. Der folgende Befehl generiert eine Liste der normalen Dateien, wandelt diese Liste in eine Folge von
rm
Befehlen um und leitet das resultierende Skript an eine Shell weiter.Das Skript wird gerade ausgeführt, während es generiert wird, und es gibt keine Schleifen, sodass die Shell (hoffentlich) keine großen temporären Dateien erstellen muss. Es wird sicherlich eine Weile dauern, da das Skript Millionen von Zeilen lang ist. Möglicherweise müssen Sie den
rm
Befehl anpassen (vielleicht hätte ich ihn verwenden sollen-f
? Aber Sie verstehen Ihre Dateien besser als ich), damit er funktioniert.Jetzt haben Sie nur noch Verzeichnisse. Hier wird es schwierig. Möglicherweise haben Sie genügend Dateien gelöscht, um
rm -rf
nicht zu wenig Arbeitsspeicher zu haben (und dies ist wahrscheinlich schneller als ein anderes Skript). Wenn nicht, können wir diese Stackoverflow-Antwort anpassen :Auch diesmal kann eine Optimierung erforderlich sein
sort
, um die Erstellung großer temporärer Dateien zu vermeiden.quelle
Ich bin vor einiger Zeit auf dasselbe Problem gestoßen. Ich habe ein kleines Hilfsprogramm geschrieben, das genau das macht: ein Verzeichnis rekursiv löschen. Die Dateien werden nicht aufgelistet und es wird nicht viel Speicher verbraucht (O (n + m) bei max mit n = maximale Verzeichnistiefe und m = maximale Datei- / Verzeichnisanzahl in einem der Unterverzeichnisse). Es kann lange Dateipfade (> 256 Zeichen) verarbeiten. Ich würde mich über Feedback freuen, wenn Sie Ihr Problem damit lösen können.
Sie finden es hier: https://github.com/McNetic/fdeltree (ausführbar im Ordner "releases")
quelle
Ich fand, dass dieser Thread nach einem besseren Weg suchte als ich, um über 3 Millionen Dateien auf mehreren der von mir unterstützten Server zu löschen. Die oben genannten sind viel zu kompliziert, so dass ich meine bekannte Methode der Verwendung des Befehlszeilentools "FORFILES" in Windows (dies war auf Server 2003) verwendet habe.
Im Folgenden ist der Befehl FORFILES aufgeführt, mit dem ich ALLE Dateien in einem Ordner über die Befehlszeile gelöscht habe.
forfiles / P "IHR ORDNERPFAD HIER (zB C: \ Windows \ Temp)" / C "cmd / c echo @datei & del / f / q @datei"
Oben ist auch ECHO der Name der Dateien, die auf dem Bildschirm gelöscht werden, aber nur, weil ich einen Fortschritt sehen wollte, der tatsächlich etwas bewirkt. Wenn Sie etwas nicht wiedergeben, sieht es so aus, als ob die DOS-Box sogar hängen geblieben ist obwohl es die Arbeit OK macht, wie erwartet.
Die Initiierung dauert eine Weile, dh es sieht so aus, als würde eine Weile nichts unternommen (ca. 30 m für ~ 3 Millionen Dateien), aber irgendwann sollten die Dateinamen angezeigt werden, sobald sie gelöscht werden. Das Löschen der Dateien dauert auch sehr lange (die Löschzeit kann sich ohne Echo verkürzen?), Funktioniert aber schließlich, ohne dass der Computer abstürzt. Auf meinem Server verwendeten forfiles während des Löschvorgangs ca. 1.850 KB Speicher. .
Die Dauer des Löschvorgangs kann zu Problemen führen, wenn sich Ihre Server automatisch abmelden, wenn Sie die Maus bewegen müssen (ich würde empfehlen, als Konsolenbenutzer oder über ein Drittanbieter-Tool wie LanDesk oder SCCM usw. (oder MouseJiggle). exe))
Wie auch immer, dachte ich würde meine Antwort teilen, viel Glück alle!
quelle