Wie viele Dateien kann ich in ein Verzeichnis stellen?

561

Ist es wichtig, wie viele Dateien ich in einem einzigen Verzeichnis aufbewahre? Wenn ja, wie viele Dateien in einem Verzeichnis sind zu viele und wie wirkt es sich aus, wenn zu viele Dateien vorhanden sind? (Dies ist auf einem Linux-Server.)

Hintergrund: Ich habe eine Fotoalbum-Website und jedes hochgeladene Bild wird in eine 8-hexadezimale ID umbenannt (z. B. a58f375c.jpg). Dies dient zur Vermeidung von Dateinamenkonflikten (wenn beispielsweise viele "IMG0001.JPG" -Dateien hochgeladen werden). Der ursprüngliche Dateiname und alle nützlichen Metadaten werden in einer Datenbank gespeichert. Im Moment habe ich ungefähr 1500 Dateien im Bilderverzeichnis. Dadurch dauert es einige Sekunden, bis die Dateien im Verzeichnis (über den FTP- oder SSH-Client) aufgelistet sind. Aber ich kann nicht sehen, dass es eine andere Wirkung hat. Insbesondere scheint es keinen Einfluss darauf zu haben, wie schnell eine Bilddatei dem Benutzer bereitgestellt wird.

Ich habe darüber nachgedacht, die Anzahl der Bilder zu reduzieren, indem ich 16 Unterverzeichnisse erstellt habe: 0-9 und af. Dann würde ich die Bilder in die Unterverzeichnisse verschieben, basierend auf der ersten hexadezimalen Ziffer des Dateinamens. Ich bin mir jedoch nicht sicher, ob es einen Grund dafür gibt, außer der gelegentlichen Auflistung des Verzeichnisses über FTP / SSH.

Pennen
quelle

Antworten:

736

FAT32 :

  • Maximale Anzahl von Dateien: 268.173.300
  • Maximale Anzahl von Dateien pro Verzeichnis: 2 16  - 1 (65.535)
  • Maximale Dateigröße: 2 GiB - 1 ohne LFS , 4 GiB - 1 mit

NTFS :

  • Maximale Anzahl von Dateien: 2 32  - 1 (4.294.967.295)
  • maximale Dateigröße
    • Implementierung: 2 44  - 2 6 Bytes (16 TiB - 64 KiB)
    • Theoretisch: 2 64  - 2 6 Bytes (16 EiB - 64 KiB)
  • Maximale Volumengröße
    • Implementierung: 2 32  - 1 Cluster (256 TiB - 64 KiB)
    • Theoretisch: 2 64  - 1 Cluster (1 YiB - 64 KiB)

ext2 :

  • Maximale Anzahl von Dateien: 10 18
  • Maximale Anzahl von Dateien pro Verzeichnis: ~ 1,3 × 10 20 (Leistungsprobleme nach 10.000)
  • maximale Dateigröße
    • 16 GiB (Blockgröße von 1 KiB)
    • 256 GiB (Blockgröße von 2 KiB)
    • 2 TiB (Blockgröße 4 KiB)
    • 2 TiB (Blockgröße 8 KiB)
  • Maximale Volumengröße
    • 4 TiB (Blockgröße 1 KiB)
    • 8 TiB (Blockgröße 2 KiB)
    • 16 TiB (Blockgröße 4 KiB)
    • 32 TiB (Blockgröße 8 KiB)

ext3 :

  • Maximale Anzahl von Dateien: min (volumeSize / 2 13 , numberOfBlocks)
  • Maximale Dateigröße: wie ext2
  • Maximale Volume-Größe: wie ext2

ext4 :

  • Maximale Anzahl von Dateien: 2 32  - 1 (4.294.967.295)
  • Maximale Anzahl von Dateien pro Verzeichnis: unbegrenzt
  • Maximale Dateigröße: 2 44  - 1 Bytes (16 TiB - 1)
  • Maximale Volume-Größe: 2 48  - 1 Byte (256 TiB - 1)
ISW
quelle
24
Ich gehe davon aus, dass dies die maximale Anzahl von Dateien für die gesamte Partition ist, kein Verzeichnis. Daher sind diese Informationen in Bezug auf das Problem nicht allzu nützlich, da unabhängig von der Methode eine gleiche Anzahl von Dateien vorhanden ist (es sei denn, Sie zählen Verzeichnisse als Dateien).
Strager
19
Da wir jetzt im Jahr 2012 sind, denke ich, ist es an der Zeit klar zu machen, dass ext4 keine Begrenzung hinsichtlich der Anzahl der Unterverzeichnisse hat. Auch die maximale Dateigröße stieg auf 16 TB. Darüber hinaus kann die Gesamtgröße des Dateisystems bis zu 1 EB = 1.048.576 TB betragen.
devsnd
7
Anscheinend hat ext3 auch ein Limit von 60.000 Dateien (oder Verzeichnissen oder Links) pro Verzeichnis. Ich habe es auf die harte Tour herausgefunden.
Stapel
8
Alte Antwort, ich weiß ... aber wenn Sie EXT4 schreiben - Maximale Anzahl von Dateien: 2³² - 1 (4.294.967.295) und Maximale Anzahl von Dateien pro Verzeichnis: unbegrenzt Sie haben mich wirklich verwirrt, weil 2³² - 1! = "Unbegrenzt". Ich brauche jetzt wohl einen Kaffee. ;) Trotzdem +1
E-Sushi
11
Harte Dateisystembeschränkungen beantworten nicht die Frage " Ist es wichtig, wie viele Dateien ich in einem einzigen Verzeichnis aufbewahre? "
Etki
191

Ich habe über 8 Millionen Dateien in einem einzigen ext3-Verzeichnis gehabt. Libc readdir()die von verwendet wird find, lsund die meisten der anderen Methoden in diesem Thread Liste großen Verzeichnissen diskutiert.

Der Grund lsund finddie Langsamkeit in diesem Fall besteht darin, dass readdir()nur 32 KB Verzeichniseinträge gleichzeitig gelesen werden. Auf langsamen Festplatten sind daher viele, viele Lesevorgänge erforderlich, um ein Verzeichnis aufzulisten. Für dieses Geschwindigkeitsproblem gibt es eine Lösung. Ich habe einen ziemlich detaillierten Artikel darüber geschrieben unter: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with- ls /

Der Schlüssel zum Mitnehmen lautet: Verwenden Sie getdents()direkt - http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html und nicht alles, was auf libc basiert, readdir()damit Sie den Puffer angeben können Größe beim Lesen von Verzeichniseinträgen von der Festplatte.

Ben
quelle
6
Interessante Lektüre! Kann ich fragen, in welcher Situation Sie 8 Millionen Dateien in einem Verzeichnis hatten? haha
Aᴄʜᴇʀᴏɴғᴀɪʟ
Ich hatte das gleiche. Ich habe die Blob-Spalte einer Tabelle migriert, jede Blob-Spalte, die ich als Datei exportiert habe. Es sind ungefähr 8 Millionen Dateien :)
Spike
65

Ich habe ein Verzeichnis mit 88.914 Dateien. Wie Sie wird dies zum Speichern von Miniaturansichten und auf einem Linux-Server verwendet.

Gelistete Dateien über FTP oder eine PHP-Funktion sind zwar langsam, aber es gibt auch einen Leistungseinbruch beim Anzeigen der Datei. zB www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg hat eine Wartezeit von 200-400 ms. Zum Vergleich auf einer anderen Seite habe ich mit ca. 100 Dateien in einem Verzeichnis das Bild nach nur ~ 40ms Wartezeit angezeigt.

Ich habe diese Antwort gegeben, da die meisten Leute gerade geschrieben haben, wie Verzeichnissuchfunktionen ausgeführt werden, die Sie nicht für einen Daumenordner verwenden - nur statische Dateien anzeigen, aber an der Leistung interessiert sind, wie die Dateien tatsächlich verwendet werden können .

S ..
quelle
6
Dies ist die einzig nützliche Antwort. Wir haben ähnliche Erfahrungen gemacht. Unser Limit liegt bei 1.000 Dateien, um Probleme mit Backups zu reduzieren (zu viele Verzeichnisse werden ebenfalls langsamer).
mgutt
1
Es kann nützlich sein, ein Laufwerk auch mit noatime zu mounten: howtoforge.com/… und dies auch zu lesen: serverfault.com/questions/354017/…
mgutt
2
Welches Dateisystem verwenden Sie, wo es so stark verlangsamt wird? XFS sollte beispielsweise in der Lage sein, 100.000 Dateien in einem Verzeichnis problemlos zu verarbeiten, ohne dass eine merkliche Verlangsamung auftritt.
Ethan
1
Ich widerspreche der Meinung der meisten anderen und möchte diese Antwort bestätigen. Wir haben Hunderttausende von Bildern auf unserer Website für soziale Netzwerke. Um die Leistung zu verbessern, mussten wir 100 (oder 1000 für einige Dateien) Unterverzeichnisse haben und die Dateien darin verteilen (ext3 unter Linux + Apache für uns).
Wmac
57

Dies hängt ein wenig von dem spezifischen Dateisystem ab, das auf dem Linux-Server verwendet wird. Heutzutage ist die Standardeinstellung ext3 mit dir_index, was das Durchsuchen großer Verzeichnisse sehr schnell macht.

Geschwindigkeit sollte also kein anderes Problem sein als das, das Sie bereits bemerkt haben. Das heißt, dass Listings länger dauern werden.

Die Gesamtzahl der Dateien in einem Verzeichnis ist begrenzt. Ich scheine mich zu erinnern, dass es definitiv bis zu 32000 Dateien funktioniert.

Bart Schuller
quelle
4
Gnome und KDE laden große Verzeichnisse im Schneckentempo. Windows speichert das Verzeichnis so, dass es angemessen ist. Ich liebe Linux, aber kde und gnome sind schlecht geschrieben.
Turm
1
Und ext4 scheint standardmäßig das Äquivalent von dir_index zu haben.
Prof. Falken Vertrag verletzt
22
In ext3 gibt es ein Limit von ca. 32.000 Unterverzeichnissen in einem Verzeichnis, aber das OP spricht von Bilddateien. Es gibt keine (praktische?) Beschränkung für Dateien in einem ext3-Dateisystem mit aktiviertem Dir-Index.
Peter N Lewis
1
Diese Antwort ist veraltet, heutzutage ist die Standardeinstellung ext4 .
Boris
1
"Es gibt keine (praktische?) Beschränkung für Dateien in einem ext3-Dateisystem mit aktiviertem Dir-Index" - Ich habe gerade keinen Dateibereich in einem Verzeichnis auf einem 4-TB-ext4-Dateisystem mit dir_indexaktiviertem. Ich hatte ungefähr 17 Millionen Dateien im Verzeichnis. Die Antwort war, sich large_dirmit tune2fs einzuschalten.
Lunixbochs
49

Beachten Sie, dass unter Linux die Shell möglicherweise keine Platzhalter erweitern kann, wenn Sie ein Verzeichnis mit zu vielen Dateien haben. Ich habe dieses Problem mit einem Fotoalbum, das unter Linux gehostet wird. Es speichert alle Bilder in der Größe in einem einzigen Verzeichnis. Während das Dateisystem viele Dateien verarbeiten kann, kann die Shell dies nicht. Beispiel:

-shell-3.00$ ls A*
-shell: /bin/ls: Argument list too long

oder

-shell-3.00$ chmod 644 *jpg
-shell: /bin/chmod: Argument list too long
Steve Kuo
quelle
33
@Steve, benutze für diese Fälle find (1) und / oder xargs (1). Aus dem gleichen Grund ist es eine gute Idee, solche Tools in Skripten anstelle der Befehlszeilenerweiterung zu verwenden.
Dave C
3
@Steve sehen Sie eine Leistungsminderung, wenn die Anzahl der Dateien in einem Ordner zunimmt? Oder gibt es keine Beziehung?
Pacerier
6
Dies ist ein guter Punkt, aber um nicht zu wählen, ist der angegebene Grund falsch. Die zu lange Argumentliste ist keine Einschränkung der Shell, sondern der execImplementierung des Systems . Die Shell kann den Platzhalter normalerweise problemlos erweitern - es ist der Aufruf execmit so vielen Argumenten, der den Fehler zurückgibt.
jw013
Ich hatte gestern Abend den gleichen Fehler (Fedora 15) mit "rm" (somefiles *) mit ungefähr 400.000 Dateien in einem Verzeichnis. Ich konnte die älteren Dateien mit "find" so weit zuschneiden, dass ich sie mit einem Platzhalter "rm" konnte.
PJ Brunet
10.000.000 Dateien in einem Verzeichnis auf etx4 funktionieren einwandfrei. Kein großer Leistungseinbruch beim Zugriff. Aber eher langsam mit Wildcard. Seien Sie vorsichtig, wenn Sie Shell-Programme verwenden, die Dateinamen sortieren möchten! :)
Simon Rigét
25

Ich arbeite gerade an einem ähnlichen Problem. Wir haben eine hierarchische Verzeichnisstruktur und verwenden Bild-IDs als Dateinamen. Zum Beispiel wird ein Bild mit id=1234567platziert

..../45/67/1234567_<...>.jpg

Verwenden Sie die letzten 4 Ziffern, um zu bestimmen, wohin die Datei geht.

Mit einigen tausend Bildern könnten Sie eine einstufige Hierarchie verwenden. Unser Systemadministrator schlug nicht mehr als ein paar tausend Dateien in einem bestimmten Verzeichnis (ext3) vor, um die Effizienz / Sicherung / aus welchen anderen Gründen auch immer.

Armandino
quelle
1
Dies ist eine ziemlich schöne Lösung. Jede Ebene Ihres Verzeichnisses bis auf die Datei würde höchstens 100 Einträge enthalten, wenn Sie sich an die zweistellige Aufschlüsselung halten, und das unterste Verzeichnis hätte nur 1 Datei.
RobKohr
PHP-Implementierung: stackoverflow.com/a/29707920/318765
mgutt
21

Für das, was es wert ist, habe ich gerade ein Verzeichnis in einem ext4Dateisystem mit 1.000.000 Dateien erstellt und dann über einen Webserver zufällig auf diese Dateien zugegriffen. Ich habe keine Prämie beim Zugriff auf diejenigen bemerkt, die nur 10 Dateien haben.

Das ist radikal von meiner Erfahrung vor ntfseinigen Jahren.

TJ Crowder
quelle
Welche Art von Dateien? Text oder Bilder? Ich bin auf ext4 und muss 80000 Bilder in ein einziges Verzeichnis unter WordPress importieren und möchte wissen, ob es in Ordnung ist
Yvon Huynh
1
@YvonHuynh: Die Art der Datei ist völlig irrelevant. Der Overhead im Verzeichnis zum Auflisten / Verfolgen der Datei ist unabhängig davon gleich.
TJ Crowder
14

Das größte Problem, auf das ich gestoßen bin, ist ein 32-Bit-System. Sobald Sie eine bestimmte Zahl überschritten haben, funktionieren Tools wie 'ls' nicht mehr.

Der Versuch, mit diesem Verzeichnis etwas zu tun, sobald Sie diese Barriere überschritten haben, wird zu einem großen Problem.

Mike Paterson
quelle
9

Ich habe das gleiche Problem gehabt. Der Versuch, Millionen von Dateien auf einem Ubuntu-Server in ext4 zu speichern. Ich habe meine eigenen Benchmarks beendet. Es wurde festgestellt, dass das flache Verzeichnis eine viel bessere Leistung erbringt und gleichzeitig viel einfacher zu verwenden ist:

Benchmark

Schrieb einen Artikel .

Hartator
quelle
Ein Link zu einer Lösung ist willkommen, aber stellen Sie bitte sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden.
Samuel Liew
1
Interessant. Wir haben festgestellt, dass sich die Leistung bereits nach 10.000 Dateien sehr schnell verschlechterte und unbrauchbar wurde. Wir haben uns entschlossen, die Dateien auf jeder Ebene in Unterverzeichnisse von etwa 100 zu unterteilen, um eine optimale Leistung zu erzielen. Ich denke, die Moral der Geschichte besteht darin, sie immer auf Ihren eigenen Systemen mit Ihren eigenen Anforderungen zu vergleichen.
Joshua Pinter
7

Wenn der Zeitaufwand für die Implementierung eines Verzeichnispartitionierungsschemas minimal ist, bin ich dafür. Wenn Sie zum ersten Mal ein Problem debuggen müssen, bei dem ein Verzeichnis mit 10000 Dateien über die Konsole bearbeitet wird, werden Sie verstehen.

In F-Spot werden beispielsweise Fotodateien als JJJJ \ MM \ TT \ Dateiname.ext gespeichert. Dies bedeutet, dass das größte Verzeichnis, mit dem ich mich bei der manuellen Bearbeitung meiner ~ 20000-Fotosammlung befassen musste, etwa 800 Dateien umfasst. Dadurch können die Dateien auch leichter von einer Drittanbieteranwendung aus durchsucht werden. Gehen Sie niemals davon aus, dass Ihre Software das einzige ist, das auf die Dateien Ihrer Software zugreift.

Sparr
quelle
6
Ich mache Werbung gegen die Partitionierung nach Datum, da Massenimporte zu einem bestimmten Datum möglicherweise Cluster-Dateien enthalten.
Max
Ein guter Punkt. Sie sollten auf jeden Fall Ihre Anwendungsfälle berücksichtigen, bevor Sie ein Partitionierungsschema auswählen. Ich importiere Fotos über viele Tage in einer relativ breiten Verteilung, und wenn ich die Fotos außerhalb des F-Spot-Datums bearbeiten möchte, ist dies der einfachste Weg, sie zu finden. Für mich ist dies also ein doppelter Gewinn.
Sparr
7

Es kommt absolut auf das Dateisystem an. Viele moderne Dateisysteme verwenden anständige Datenstrukturen, um den Inhalt von Verzeichnissen zu speichern, aber ältere Dateisysteme fügten die Einträge häufig nur einer Liste hinzu, sodass das Abrufen einer Datei eine O (n) -Operation war.

Selbst wenn das Dateisystem es richtig macht, ist es für Programme, die Verzeichnisinhalte auflisten, absolut möglich, Fehler zu machen und eine O (n ^ 2) -Sortierung durchzuführen. Um auf der sicheren Seite zu sein, würde ich immer die Anzahl der Dateien pro Datei begrenzen Verzeichnis auf nicht mehr als 500.

Michael Borgwardt
quelle
7

Es hängt wirklich vom verwendeten Dateisystem und einigen Flags ab.

Zum Beispiel kann ext3 viele tausend Dateien haben; aber nach ein paar tausend war es sehr langsam. Meistens beim Auflisten eines Verzeichnisses, aber auch beim Öffnen einer einzelnen Datei. Vor einigen Jahren erhielt es die Option 'htree', die die Zeit, die benötigt wird, um eine Inode mit einem Dateinamen zu erhalten, drastisch verkürzte.

Persönlich verwende ich Unterverzeichnisse, um die meisten Ebenen unter etwa tausend Elementen zu halten. In Ihrem Fall würde ich 256 Verzeichnisse mit den beiden letzten hexadezimalen Ziffern der ID erstellen. Verwenden Sie die letzte und nicht die erste Ziffer, damit die Last ausgeglichen wird.

Javier
quelle
6
Wenn die Dateinamen völlig zufällig wären, wäre es egal, welche Ziffern verwendet wurden.
Strager
In der Tat werden diese Dateinamen zufällig generiert.
Kip
2
Oder verwenden Sie die ersten N Bytes des SHA-1-Digests des Dateinamens.
Gawi
6

ext3 hat tatsächlich Verzeichnisgrößenbeschränkungen, die von der Blockgröße des Dateisystems abhängen. Es gibt keine "maximale Anzahl" von Dateien pro Verzeichnis, sondern eine "maximale Anzahl von Blöcken, die zum Speichern von Dateieinträgen verwendet werden" pro Verzeichnis. Insbesondere kann die Größe des Verzeichnisses selbst nicht über einen B-Baum der Höhe 3 hinaus wachsen, und das Fanout des Baums hängt von der Blockgröße ab. Siehe diesen Link für einige Details.

https://www.mail-archive.com/[email protected]/msg01944.html

Dies hat mich kürzlich auf ein mit 2K-Blöcken formatiertes Dateisystem gebissen, das warning: ext3_dx_add_entry: Directory index full!beim Kopieren aus einem anderen ext3-Dateisystem unerklärlicherweise verzeichnisreiche Kernel-Nachrichten erhielt . In meinem Fall konnte ein Verzeichnis mit nur 480.000 Dateien nicht an das Ziel kopiert werden.

Daten
quelle
5

Die Frage hängt davon ab, was Sie mit den Dateien tun werden.

Unter Windows wird jedes Verzeichnis mit mehr als 2.000 Dateien im Explorer für mich langsam geöffnet. Wenn es sich um alle Bilddateien handelt, öffnen sich mehr als 1 KB in der Miniaturansicht sehr langsam.

Zu einer Zeit betrug das vom System auferlegte Limit 32.767. Es ist jetzt höher, aber selbst das sind unter den meisten Umständen viel zu viele Dateien, um sie gleichzeitig zu verarbeiten.

Ja - dieser Jake.
quelle
5

Was die meisten der obigen Antworten nicht zeigen, ist, dass es keine Antwort auf die ursprüngliche Frage "Einheitsgröße" gibt.

In der heutigen Umgebung haben wir ein großes Konglomerat unterschiedlicher Hardware und Software - einige sind 32-Bit, einige sind 64-Bit, einige sind auf dem neuesten Stand und einige sind bewährt - zuverlässig und ändern sich nie. Hinzu kommen eine Vielzahl älterer und neuerer Hardware, ältere und neuere Betriebssysteme, verschiedene Anbieter (Windows, Unixes, Apple usw.) sowie eine Vielzahl von Dienstprogrammen und Servern. Da sich die Hardware verbessert und die Software auf 64-Bit-Kompatibilität umgestellt hat, hat es notwendigerweise erhebliche Verzögerungen gegeben, alle Teile dieser sehr großen und komplexen Welt dazu zu bringen, mit dem schnellen Tempo der Änderungen gut zu spielen.

IMHO gibt es keine Möglichkeit, ein Problem zu beheben. Die Lösung besteht darin, die Möglichkeiten zu erforschen und dann durch Ausprobieren herauszufinden, was für Ihre speziellen Anforderungen am besten geeignet ist. Jeder Benutzer muss bestimmen, was für sein System funktioniert, anstatt einen Cookie-Cutter-Ansatz zu verwenden.

Ich habe zum Beispiel einen Medienserver mit ein paar sehr großen Dateien. Das Ergebnis sind nur etwa 400 Dateien, die ein 3-TB-Laufwerk füllen. Es wird nur 1% der Inodes verwendet, aber 95% des gesamten Speicherplatzes. Jemand anderem mit vielen kleineren Dateien gehen möglicherweise die Inodes aus, bevor sie sich dem Ausfüllen des Speicherplatzes nähern. (Auf ext4-Dateisystemen wird als Faustregel 1 Inode für jede Datei / jedes Verzeichnis verwendet.) Während theoretisch die Gesamtzahl der Dateien, die in einem Verzeichnis enthalten sein können, nahezu unendlich ist, bestimmt die Praktikabilität, dass die Gesamtnutzung realistische Einheiten bestimmt, nicht nur Dateisystemfunktionen.

Ich hoffe, dass all die verschiedenen Antworten oben das Denken und Lösen von Problemen gefördert haben, anstatt ein unüberwindbares Hindernis für den Fortschritt darzustellen.

Computersavvy
quelle
4

Ich erinnere mich, dass ich ein Programm ausgeführt habe, das am Ausgang eine große Anzahl von Dateien erstellt hat. Die Dateien wurden nach 30000 pro Verzeichnis sortiert. Ich kann mich nicht erinnern, Leseprobleme gehabt zu haben, als ich die produzierte Ausgabe wiederverwenden musste. Es befand sich auf einem 32-Bit-Ubuntu-Linux-Laptop, und sogar Nautilus zeigte den Verzeichnisinhalt an, wenn auch nach einigen Sekunden.

ext3-Dateisystem: Ähnlicher Code auf einem 64-Bit-System hat sich gut mit 64000 Dateien pro Verzeichnis befasst.

user54579
quelle
4

"Abhängig vom Dateisystem"
Einige Benutzer erwähnten, dass die Auswirkungen auf die Leistung vom verwendeten Dateisystem abhängen. Na sicher. Dateisysteme wie EXT3 können sehr langsam sein. Aber selbst wenn Sie EXT4 oder XFS verwenden, können Sie nicht verhindern, dass ein Ordner durch lsoder aufgelistet wirdfind oder über eine externe Verbindung wie FTP wird langsamer werden ein langsamer.

Lösung
Ich bevorzuge den gleichen Weg wie @armandino . Dafür verwende ich diese kleine Funktion in PHP, um IDs in einen Dateipfad zu konvertieren, der 1000 Dateien pro Verzeichnis ergibt:

function dynamic_path($int) {
    // 1000 = 1000 files per dir
    // 10000 = 10000 files per dir
    // 2 = 100 dirs per dir
    // 3 = 1000 dirs per dir
    return implode('/', str_split(intval($int / 1000), 2)) . '/';
}

oder Sie können die zweite Version verwenden, wenn Sie alphanumerische Zeichen verwenden möchten:

function dynamic_path2($str) {
    // 26 alpha + 10 num + 3 special chars (._-) = 39 combinations
    // -1 = 39^2 = 1521 files per dir
    // -2 = 39^3 = 59319 files per dir (if every combination exists)
    $left = substr($str, 0, -1);
    return implode('/', str_split($left ? $left : $str[0], 2)) . '/';
}

Ergebnisse:

<?php
$files = explode(',', '1.jpg,12.jpg,123.jpg,999.jpg,1000.jpg,1234.jpg,1999.jpg,2000.jpg,12345.jpg,123456.jpg,1234567.jpg,12345678.jpg,123456789.jpg');
foreach ($files as $file) {
    echo dynamic_path(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>

1/1.jpg
1/12.jpg
1/123.jpg
1/999.jpg
1/1000.jpg
2/1234.jpg
2/1999.jpg
2/2000.jpg
13/12345.jpg
12/4/123456.jpg
12/35/1234567.jpg
12/34/6/12345678.jpg
12/34/57/123456789.jpg

<?php
$files = array_merge($files, explode(',', 'a.jpg,b.jpg,ab.jpg,abc.jpg,ddd.jpg,af_ff.jpg,abcd.jpg,akkk.jpg,bf.ff.jpg,abc-de.jpg,abcdef.jpg,abcdefg.jpg,abcdefgh.jpg,abcdefghi.jpg'));
foreach ($files as $file) {
    echo dynamic_path2(basename($file, '.jpg')) . $file . PHP_EOL;
}
?>

1/1.jpg
1/12.jpg
12/123.jpg
99/999.jpg
10/0/1000.jpg
12/3/1234.jpg
19/9/1999.jpg
20/0/2000.jpg
12/34/12345.jpg
12/34/5/123456.jpg
12/34/56/1234567.jpg
12/34/56/7/12345678.jpg
12/34/56/78/123456789.jpg
a/a.jpg
b/b.jpg
a/ab.jpg
ab/abc.jpg
dd/ddd.jpg
af/_f/af_ff.jpg
ab/c/abcd.jpg
ak/k/akkk.jpg
bf/.f/bf.ff.jpg
ab/c-/d/abc-de.jpg
ab/cd/e/abcdef.jpg
ab/cd/ef/abcdefg.jpg
ab/cd/ef/g/abcdefgh.jpg
ab/cd/ef/gh/abcdefghi.jpg

Wie Sie für die sehen können $int -version sehen können, enthält jeder Ordner bis zu 1000 Dateien und bis zu 99 Verzeichnisse mit 1000 Dateien und 99 Verzeichnissen ...

Vergessen Sie aber nicht, dass zu viele Verzeichnisse die gleichen Leistungsprobleme verursachen!

Schließlich sollten Sie darüber nachdenken, wie Sie die Anzahl der Dateien insgesamt reduzieren können. Abhängig von Ihrem Ziel können Sie CSS-Sprites verwenden, um mehrere kleine Bilder wie Avatare, Symbole, Smilies usw. zu kombinieren. Wenn Sie viele kleine Nicht-Mediendateien verwenden, sollten Sie diese beispielsweise im JSON-Format kombinieren. In meinem Fall hatte ich Tausende von Mini-Caches und schließlich entschied ich mich, sie in 10er-Packs zu kombinieren.

mgutt
quelle
3

Ich respektiere, dass dies Ihre Frage, wie viele zu viele sind, nicht vollständig beantwortet. Eine Idee zur Lösung des Langzeitproblems ist jedoch, dass Sie neben dem Speichern der ursprünglichen Dateimetadaten auch den Ordner auf der Festplatte speichern, in dem er gespeichert ist - normalisieren aus diesem Stück Metadaten. Sobald ein Ordner eine Grenze überschreitet, mit der Sie aus Gründen der Leistung, Ästhetik oder aus irgendeinem Grund vertraut sind, erstellen Sie einfach einen zweiten Ordner und legen dort Dateien ab ...

Goyuix
quelle
3

Ich bin auf ein ähnliches Problem gestoßen. Ich habe versucht, auf ein Verzeichnis mit über 10.000 Dateien zuzugreifen. Es dauerte zu lange, um die Dateiliste zu erstellen und beliebige Befehle für eine der Dateien auszuführen.

Ich habe mir ein kleines PHP-Skript ausgedacht, um dies für mich selbst zu tun, und versucht, einen Weg zu finden, um eine Zeitüberschreitung im Browser zu verhindern.

Das folgende ist das PHP-Skript, das ich geschrieben habe, um das Problem zu beheben.

Auflisten von Dateien in einem Verzeichnis mit zu vielen Dateien für FTP

Wie es jemandem hilft

Swhistlesoft
quelle
1

Keine Antwort, sondern nur ein paar Vorschläge.

Wählen Sie ein geeigneteres FS (Dateisystem). Aus historischer Sicht waren alle Ihre Probleme klug genug, um einst für FSs von zentraler Bedeutung zu sein, die sich über Jahrzehnte entwickelt haben. Ich meine, modernere FS unterstützen Ihre Probleme besser. Erstellen Sie zunächst eine Vergleichsentscheidungstabelle, die auf Ihrem endgültigen Zweck basiert FS-Liste .

Ich denke, es ist Zeit, Ihre Paradigmen zu ändern. Also schlage ich persönlich vor, ein verteiltes systembewusstes FS zu verwenden , was in Bezug auf Größe, Anzahl der Dateien usw. keinerlei Einschränkungen bedeutet. Andernfalls werden Sie früher oder später durch neue unerwartete Probleme herausgefordert.

Ich bin mir nicht sicher, ob ich funktionieren werde, aber wenn Sie keine Experimente erwähnen, probieren Sie AUFS über Ihr aktuelles Dateisystem aus. Ich denke, es hat Möglichkeiten, mehrere Ordner als einen einzigen virtuellen Ordner nachzuahmen.

Um Hardware-Limits zu überwinden, können Sie RAID-0 verwenden.

Shvahabi
quelle
1

Es gibt keine einzelne Zahl, die "zu viele" ist, solange sie die Grenzen des Betriebssystems nicht überschreitet. Je mehr Dateien sich in einem Verzeichnis befinden, unabhängig vom Betriebssystem, desto länger dauert der Zugriff auf eine einzelne Datei. Bei den meisten Betriebssystemen ist die Leistung nicht linear. Das Auffinden einer von 10.000 Dateien dauert also mehr als zehnmal länger dann, um eine Datei in 1.000 zu finden.

Zu den sekundären Problemen, die mit vielen Dateien in einem Verzeichnis verbunden sind, gehören Platzhalter-Erweiterungsfehler. Um das Risiko zu verringern, können Sie Ihre Verzeichnisse nach dem Datum des Uploads oder nach anderen nützlichen Metadaten sortieren.

Paul Smith
quelle