Wie viele Dateien in einem Verzeichnis sind zu viele? (Herunterladen von Daten aus dem Netz)

19

Schöne Grüße,

Ich schreibe einige Skripte, um Bilder von verschiedenen Foto-Websites zu verarbeiten. Im Moment speichere ich all diese Daten in einzelnen Textdateien im selben Verzeichnis.

Das Verzeichnis ist über das Internet zugänglich. Ein Endbenutzer ruft einen Webdienst auf, der den Pfad zu der Datei zurückgibt, die der Benutzer benötigt.

Ich habe mich gefragt, in welchem ​​Stadium eine Beeinträchtigung der Leistung zu erwarten ist, wenn sich alle diese Dateien im selben Verzeichnis befinden. (Wenn überhaupt)

Steve
quelle
Einige Zahlen für MacOS hier
smci 20.11.17
Related: superuser.com/q/453348/453247
Stephen R

Antworten:

12

Die Leistung hängt vom verwendeten Dateisystem ab.

  • FAT: vergiss es :) (ok, ich denke das Limit ist 512 Dateien pro Verzeichnis)
  • NTFS: Obwohl es 4 Milliarden Dateien pro Ordner aufnehmen kann, nimmt es relativ schnell ab - bei etwa 1000 werden Sie Leistungsprobleme bemerken, bei einigen Tausend und Sie werden feststellen, dass der Explorer für eine Weile hängen bleibt.
  • EXT3: Das physikalische Limit liegt bei 32.000 Dateien, aber die Leistung leidet auch nach mehreren tausend Dateien.

  • EXT4: theoretisch unbegrenzt

  • ReiserFS, XFS, JFS, BTRFS: Dies sind die guten für viele Dateien in einem Verzeichnis, da sie moderner und für die Verarbeitung vieler Dateien ausgelegt sind (die anderen wurden in der Zeit entwickelt, als Festplatten in MB und nicht in GB gemessen wurden). . Die Leistung ist für viele Dateien (zusammen mit ext4) viel besser, da beide einen binären Suchalgorithmus verwenden, um die gewünschte Datei zu erhalten (die anderen verwenden eine linearere).

gbjbaanb
quelle
6
Das ist falsch. Es gibt kein Limit von 32000 Dateien in EXT3. Es gibt ein Limit von 32000 Unterverzeichnissen. Ich habe hier ein Verzeichnis mit über 300000 Dateien und es funktioniert gut.
Davidsheldon
1
Ganz richtig - das Dateilimit ist das gesamte Dateisystemlimit für Inodes, aber Sie sind auf 32.000 Links (dh Unterverzeichnisse) beschränkt.
gbjbaanb
Die Aussage für das aktuelle NTFS ist ebenfalls nicht wahr, sie kann bis zu 4.294.967.295 (2 ^ 32 - 1) enthalten: technet.microsoft.com/en-us/library/cc781134%28WS.10%29.aspx
Fleshgrinder
Verwechseln Sie keine Unterverzeichnisse mit Dateien, auf CentOS-Rechnern hatte ich 32000 Unterverzeichnisse, das Limit erreicht, ich habe alle DATEIEN in diesem einen Verzeichnis verschoben und funktioniert immer noch einwandfrei.
adrianTNT
Einige Zahlen für MacOS hier
smci 20.11.17
8

Ich speichere Bilder für die Bereitstellung durch einen Webserver und habe über 300.000 Bilder in einem Verzeichnis auf EXT3. Ich sehe keine Leistungsprobleme. Bevor ich dies eingerichtet habe, habe ich Tests mit 500.000 Bildern in einem Verzeichnis und wahllosem Zugriff auf Dateien nach Namen durchgeführt. Bei 500.000 über 10.000 Bildern im Verzeichnis gab es keine signifikante Verlangsamung.

Der einzige Nachteil, den ich sehe, ist, dass ich, um die neuen mit einem zweiten Server zu synchronisieren, rsyncdas gesamte Verzeichnis durchsuchen muss und es nicht einfach anweisen kann, ein Unterverzeichnis mit den letzten Tausend oder so zu synchronisieren.

Davidsheldon
quelle
Nun, um mit einem zweiten Server zu synchronisieren, denke ich, dass Sie eine Struktur und einen Algorithmus erstellen müssen, die die Änderungen beibehalten, dann kann dieses Protokoll viel Zeit sparen.
Bahadir Tasdemir
+1 Damit ist die Frage tatsächlich beantwortet.
Kubanczyk
Ein Nachteil: Wenn Sie einen FTP-Client wie FileZilla verwenden und den Inhalt des Ordners auflisten möchten, dauert es eine Weile.
Kai Noack
3

Die Anzahl der Dateien in einem Ordner kann theoretisch unbegrenzt sein. Jedes Mal, wenn das Betriebssystem auf den bestimmten Ordner zugreift, um nach Dateien zu suchen, muss es jedoch alle Dateien im Ordner verarbeiten. Bei weniger als 500 Dateien stellen Sie möglicherweise keine Verzögerungen fest. Wenn sich jedoch Zehntausende von Dateien in einem Ordner befinden, kann ein einfacher Ordnerlistenbefehl (ls oder dir) viel zu lange dauern. Wenn auf diese Ordner über FTP zugegriffen werden kann, wird es wirklich zu langsam sein ...

Leistungsprobleme hängen nicht wirklich von Ihrem Betriebssystem ab, sondern von der Geschwindigkeit des Systemprozessors, den Festplattenkapazitäten und dem Arbeitsspeicher. Wenn Sie über so viele Dateien verfügen, möchten Sie diese möglicherweise in einem einzigen Archiv zusammenfassen und ein Archivierungssystem verwenden, das für die Speicherung vieler Daten optimiert ist. Dies könnte eine ZIP-Datei sein, aber besser noch, speichern Sie sie als Blobs in einer Datenbank mit dem Dateinamen als Primärschlüssel.

Wim ten Brink
quelle
Aber werden durch den direkten Zugriff auf die Datei Engpässe bei der Suche in Verzeichnissen beseitigt oder wird bei einem direkten Zugriff immer noch ein Suchaufruf ausgeführt? (Linux, Debian)
Steve
3
Durch direkten Zugriff auf die Datei werden diese Probleme verringert. Ich habe Tests mit ext3 durchgeführt, und der Zugriff auf eine Datei mit Namen in einem Verzeichnis mit 500000 Dateien ist nicht wesentlich langsamer als bei einem mit 1000. Offensichtlich ist das Ausführen von ein lsProblem.
Davidsheldon
Wenn Sie den genauen Namen kennen, sollte der Zugriff schnell sein. Das Problem ist meistens jeder Code oder Befehl, der eine Liste von Dateien abrufen möchte.
Wim ten Brink
1

Meine Faustregel ist, Ordner zu teilen, wenn mehr als 1000 Dateien vorhanden sind und der Ordner durchsucht wird (dh über das Internet oder den Explorer) oder 5000 Dateien, wenn dies nicht der Fall ist.

Piep Piep
quelle
0

Wie @skaffman ausführt, hängen die Grenzwerte vom Betriebssystem ab. Es ist wahrscheinlich, dass Sie von Einschränkungen älterer Betriebssysteme betroffen sind. Ich erinnere mich, dass eine alte Version von Solaris auf 32768 Dateien pro Verzeichnis beschränkt war.

Die übliche Lösung besteht darin, eine Art Hashing zu verwenden, dh der Cyrus imap-Server teilt die Benutzer nach einem alphabetischen Hash auf:

/var/spool/imap/a/user/anna/
/var/spool/imap/a/user/albert/
/var/spool/imap/d/user/dan/
/var/spool/imap/e/user/ewan/
diciu
quelle
1
Danke, ich hätte definitiv etwas an Ort und Stelle, sobald ein Verzeichnis mehr als 2k Dateien hat! :)
Steve
Diese Frage hat einige gute Antworten: serverfault.com/questions/95444/…
Davey
Meine allgemeine Faustregel lautet, dass mehr als 20.000 Dateien in einem Verzeichnis keine gute Idee sind. Die meisten modernen Dateisysteme können mit so vielen Dateien umgehen. Sobald Sie 32k-Dateien in einem Verzeichnis gefunden haben, treten bei einigen Dateisystemen wie ext3 ernsthafte Leistungsprobleme auf.
Phil Hollenback
Phil - Haben Sie Informationen zu Leistungsproblemen mit mehr als 32.000 Dateien mit ext3? Ich sehe derzeit keine mit mehr als 300.000 Dateien. Vielleicht hat das nichts mit meinem Verwendungsmuster zu tun.
Davidsheldon
Bei meinem vorherigen Job erzeugte wissenschaftliche Software viele kleine Dateien (jeweils einige k) in einem Verzeichnis. Wir haben definitiv gesehen, dass die Verzeichnislesezeiten für> 32k Dateien enorm ansteigen würden. Das Ausführen von 'ls' in einem Verzeichnis mit so vielen Dateien würde eine Minute oder länger dauern.
Phil Hollenback
0

Wenn Sie direkt auf eine Datei zugreifen, ist die Anzahl der Dateien in einem Verzeichnis kein Geschwindigkeitsproblem.

Die Anzahl der Dateien, die Sie in einem einzelnen Verzeichnis erstellen können, hängt vom verwendeten Dateisystem ab. Wenn Sie alle Dateien im Verzeichnis auflisten oder viele Dateien suchen, sortieren usw., werden diese Vorgänge verlangsamt.

gbjbaanb ist in seiner antwort über die maximale dateigröße von ext3 falsch. Im Allgemeinen begrenzt ext die Anzahl der Dateien auf Ihrer Disc im Allgemeinen. Sie können nicht mehr Dateien erstellen, als Sie Inodes in Ihrer Inode-Tabelle haben. Er schlägt zu Recht reiserfs für mehr Leistung mit vielen Dateien vor

Janusz
quelle
0

Überprüfter Ordner mit 10K-Dateien in NTFS (Windows 7, 64 Bit). Ordner mit 10K-Bildern in jeder Ansicht (Liste, Symbol usw.) funktioniert und scrollt ohne Verzögerung.

Vil
quelle