it-swarm.com.de

Wie viele Dateien kann ich in einem Verzeichnis ablegen?

Ist es wichtig, wie viele Dateien ich in einem einzigen Verzeichnis habe? Wenn ja, wie viele Dateien in einem Verzeichnis sind zu viele Dateien und welche Auswirkungen haben zu viele Dateien? (Dies ist auf einem Linux-Server.)

Hintergrund: Ich habe eine Fotoalbum-Website, und jedes hochgeladene Bild wird in eine 8-stellige ID umbenannt (beispielsweise a58f375c.jpg). Dies dient dazu, Dateinamenkonflikte zu vermeiden (wenn beispielsweise viele Dateien "IMG0001.JPG" hochgeladen werden). Der ursprüngliche Dateiname und alle nützlichen Metadaten werden in einer Datenbank gespeichert. Im Moment habe ich etwa 1500 Dateien im Verzeichnis images. Dadurch dauert das Auflisten der Dateien im Verzeichnis (über FTP oder SSH-Client) einige Sekunden. Aber ich kann nicht sehen, dass es anders wirkt. Insbesondere scheint es keinen Einfluss darauf zu haben, wie schnell eine Bilddatei an den Benutzer geliefert wird.

Ich habe darüber nachgedacht, die Anzahl der Bilder durch Erstellen von 16 Unterverzeichnissen zu reduzieren: 0-9 und a-f. Dann würde ich die Bilder in die Unterverzeichnisse verschieben, basierend auf der ersten Hex-Ziffer des Dateinamens. Ich bin mir jedoch nicht sicher, ob es einen Grund dafür gibt, es sei denn, das Verzeichnis wird gelegentlich über FTP/SSH aufgelistet.

519
Kip

FAT32 :

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

NTFS :

  • Maximale Anzahl von Dateien: 232- 1 (4,294,967,295)
  • Maximale Dateigröße
    • Umsetzung: 244- 26 Bytes (16 TiB - 64 KiB)
    • Theoretisch: 264- 26 Bytes (16 EiB - 64 KiB)
  • Maximale Datenträgergröße
    • Umsetzung: 232- 1 Cluster (256 TiB - 64 KiB)
    • Theoretisch: 264- 1 Cluster (1 YiB - 64 KiB)

ext2 :

  • Maximale Anzahl von Dateien: 1018
  • Maximale Anzahl von Dateien pro Verzeichnis: ~ 1,3 × 1020 (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 von 4 KiB)
    • 2 TiB (Blockgröße von 8 KiB)
  • Maximale Datenträgergröße
    • 4 TiB (Blockgröße von 1 KiB)
    • 8 TiB (Blockgröße von 2 KiB)
    • 16 TiB (Blockgröße von 4 KiB)
    • 32 TiB (Blockgröße von 8 KiB)

ext3 :

  • Maximale Anzahl von Dateien: min (volumeSize/213, NumberOfBlocks)
  • Maximale Dateigröße: wie bei ext2
  • Maximale Datenträgergröße: wie bei ext2

ext4 :

  • Maximale Anzahl von Dateien: 232- 1 (4.294.967.295)
  • Maximale Anzahl von Dateien pro Verzeichnis: unbegrenzt
  • Maximale Dateigröße: 244- 1 Byte (16 TiB - 1)
  • Maximale Volumengröße: 248- 1 Byte (256 TiB - 1)
672
ISW

Ich hatte über 8 Millionen Dateien in einem einzigen ext3-Verzeichnis. libc readdir(), das von find, ls und den meisten anderen in diesem Thread beschriebenen Methoden zum Auflisten großer Verzeichnisse verwendet wird. 

Der Grund von ls und find ist in diesem Fall langsam, da readdir() nur 32 KB von Verzeichniseinträgen auf einmal liest. Auf langsamen Festplatten sind daher viele Lesevorgänge erforderlich, um ein Verzeichnis aufzulisten. Es gibt eine Lösung für dieses Geschwindigkeitsproblem. Ich habe einen ziemlich ausführlichen Artikel darüber geschrieben: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not- mit-ls/

Der Schlüssel zum Mitnehmen ist: Verwenden Sie getdents() direkt - http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html und nicht alles, was auf libc readdir() basiert. Sie können also die Puffergröße angeben, wenn Sie Verzeichniseinträge von der Festplatte lesen. 

170
Ben

Es hängt etwas von dem spezifischen Dateisystem ab, das auf dem Linux-Server verwendet wird. Heutzutage ist die Voreinstellung ext3 mit dir_index, wodurch das Durchsuchen großer Verzeichnisse sehr schnell ist.

Geschwindigkeit sollte also kein Problem sein, außer dem, das Sie bereits bemerkt haben. Das heißt, dass Listen länger dauern werden.

Die Gesamtzahl der Dateien in einem Verzeichnis ist begrenzt. Ich scheine mich zu erinnern, dass es auf jeden Fall bis zu 32000 Dateien funktionierte. 

55
Bart Schuller

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

Gelistete Dateien über FTP oder eine PHP-Funktion sind zwar langsam, aber die Anzeige der Datei wirkt sich ebenfalls negativ auf die Leistung aus. z.B. www.website.com/thumbdir/gh3hg4h2b4h234b3h2.jpg hat eine Wartezeit von 200 bis 400 ms. Zum Vergleich auf einer anderen Site habe ich mit ca. 100 Dateien in einem Verzeichnis das Image nach ca. 40ms Wartezeit angezeigt.

Ich habe diese Antwort gegeben, da die meisten Leute soeben geschrieben haben, wie die Verzeichnissuchfunktionen funktionieren werden, die Sie nicht für einen Thumb-Ordner verwenden werden - nur das statische Anzeigen von Dateien, aber es interessiert die Leistung, wie die Dateien tatsächlich verwendet werden können .

55
S..

Beachten Sie, dass unter Linux die Platzhalter möglicherweise nicht erweitert werden können, wenn Sie über ein Verzeichnis mit zu vielen Dateien verfügen. Ich habe dieses Problem mit einem unter Linux gehosteten Fotoalbum. Es speichert alle Bilder, deren Größe geändert wurde, 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
47
Steve Kuo

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

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

verwenden Sie die letzten 4 Ziffern, um die Position der Datei festzulegen.

Bei einigen tausend Bildern können Sie eine einstufige Hierarchie verwenden. Unser Systemadministrator schlug nicht mehr als ein paar tausend Dateien in einem bestimmten Verzeichnis (ext3) für Effizienz/Backup/aus allen anderen Gründen vor.

22
armandino

Für das, was es wert ist, habe ich gerade ein Verzeichnis in einem ext4-Dateisystem mit 1.000.000 Dateien erstellt und dann über einen Webserver zufällig auf diese Dateien zugegriffen. Ich habe keinen Aufschlag darauf gesehen, auf diejenigen zuzugreifen, die nur über 10 Dateien verfügen.

Dies ist radikal unterscheidet sich von meiner Erfahrung vor ntfs vor einigen Jahren.

16
T.J. Crowder

Das größte Problem, dem ich begegnet bin, betrifft ein 32-Bit-System. Sobald Sie eine bestimmte Anzahl übergeben haben, funktionieren Werkzeuge wie 'ls' nicht mehr.

Wenn Sie versuchen, irgendetwas mit diesem Verzeichnis zu tun, sobald Sie diese Barriere überschritten haben, wird dies zu einem großen Problem.

12
Mike Paterson

Das hängt absolut vom Dateisystem ab. Viele moderne Dateisysteme verwenden ordentliche Datenstrukturen, um den Inhalt von Verzeichnissen zu speichern, aber ältere Dateisysteme fügten die Einträge oft nur zu einer Liste hinzu. Das Abrufen einer Datei war daher eine Operation O(n).

Selbst wenn das Dateisystem es richtig macht, ist es absolut möglich, dass Programme, die Verzeichnisinhalte auflisten, eine O (n ^ 2) - Sortierung durchführen. Um sicherzugehen, würde ich die Anzahl der Dateien auf jeden Fall begrenzen Verzeichnis bis maximal 500.

6

Das hängt wirklich vom verwendeten Dateisystem ab und auch von einigen Flags.

Zum Beispiel kann ext3 viele tausend Dateien enthalten. Aber nach ein paar Tausenden war es sehr langsam. Meistens beim Auflisten eines Verzeichnisses, aber auch beim Öffnen einer einzelnen Datei. Vor einigen Jahren erhielt es die Option 'htree', durch die die Zeit, die ein Inode für einen Dateinamen benötigt wurde, drastisch verkürzt wurde.

Ich persönlich verwende Unterverzeichnisse, um die meisten Ebenen unter etwa tausend Elementen zu halten. In Ihrem Fall würde ich 256 Verzeichnisse mit den beiden letzten Hex-Ziffern der ID erstellen. Verwenden Sie die letzten und nicht die ersten Ziffern, um die Last auszugleichen.

6
Javier

Wenn der Zeitaufwand für die Implementierung eines Verzeichnispartitionierungsschemas minimal ist, bin ich dafür. Wenn Sie zum ersten Mal ein Problem debuggen, das die Bearbeitung eines 10000-Dateiverzeichnisses über die Konsole beinhaltet, werden Sie verstehen.

Beispielsweise speichert F-Spot Fotodateien als JJJJ\MM\DD\Dateiname.ext. Dies bedeutet, dass das größte Verzeichnis, das ich bei der manuellen Bearbeitung meiner ~ 20000-Fotosammlung behandeln musste, ca. 800 Dateien ist. Dadurch können die Dateien auch leichter von einer Drittanbieteranwendung aus durchsucht werden. Gehen Sie niemals davon aus, dass Ihre Software die einzige Sache ist, die auf die Dateien Ihrer Software zugreifen wird.

5
Sparr

ext3 hat tatsächlich Beschränkungen für die Verzeichnisgröße und hängt von der Blockgröße des Dateisystems ab. Es gibt keine maximale Anzahl von Dateien pro Verzeichnis, sondern eine maximale Anzahl von Blöcken, die zum Speichern von Dateieinträgen verwendet werden. Insbesondere kann die Größe des Verzeichnisses selbst nicht über einen B-Baum der Höhe 3 hinauswachsen, und der 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

Ich wurde vor kurzem in ein mit 2K-Blöcken formatiertes Dateisystem gebissen, das unerklärlicherweise verzeichnisfähige Kernel-Nachrichten warning: ext3_dx_add_entry: Directory index full! erhielt, als ich aus einem anderen ext3-Dateisystem kopierte. In meinem Fall konnte ein Verzeichnis mit nur 480.000 Dateien nicht an das Ziel kopiert werden.

4
dataless

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

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

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

4

Ich erinnere mich daran, ein Programm ausgeführt zu haben, das bei der Ausgabe eine riesige Menge von Dateien erstellte. Die Dateien wurden nach 30000 pro Verzeichnis sortiert. Ich kann mich nicht erinnern, dass ich Probleme beim Lesen hatte, als ich die produzierte Ausgabe erneut verwenden musste. Es befand sich auf einem 32-Bit Ubuntu Linux-Laptop, und sogar Nautilus zeigte den Verzeichnisinhalt an, allerdings nach wenigen Sekunden.

ext3-Dateisystem: Bei einem 64-Bit-System wurde mit 64000 Dateien pro Verzeichnis ein ähnlicher Code verarbeitet.

3
user54579

Ich bin auf eine ähnliche Ausgabe 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 alle Dateien auszuführen.

Ich habe mir ein kleines PHP-Skript ausgedacht, um dies für mich selbst zu tun, und versuchte, einen Weg zu finden, um zu verhindern, dass es im Browser zu lange dauert.

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 hilft es jemandem?

2
Swhistlesoft

Ich bevorzuge dieselbe Weise 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 Werte 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 $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 jedoch nicht, dass zu viele Verzeichnisse Ihren Sicherungsvorgang beschleunigen können. Fühlen Sie sich frei, 1000 bis 10000 Dateien pro Verzeichnis zu testen. Fügen Sie jedoch nicht viel mehr hinzu, da Sie sehr lange Zugriffszeiten haben, wenn Sie die Verzeichnisdatei nach Datei lesen möchten (FTP-Clients, Funktionen zum Lesen von Dateien usw.).

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 sie kombinieren, z. im JSON-Format. In meinem Fall hatte ich Tausende von Mini-Caches und entschied mich schließlich, sie in 10er-Packs zu kombinieren.

2
mgutt

Ich respektiere, dass dies Ihre Frage nicht vollständig beantwortet, wie viele zu viele sind, aber eine Idee zur Lösung des langfristigen Problems ist, dass zusätzlich zum Speichern der ursprünglichen Datei-Metadaten auch gespeichert wird, in welchem ​​Ordner auf der Festplatte es gespeichert ist - normalize aus diesem Stück Metadaten. Sobald ein Ordner über ein gewisses Maß hinausgeht, sind Sie mit der Leistung, der Ästhetik oder aus irgendeinem Grund vertraut, Sie erstellen einfach einen zweiten Ordner und legen dort Dateien ab ...

2
Goyuix

Die meisten der obigen Antworten zeigen nicht, dass es keine "One Size Fits All" -Antwort auf die ursprüngliche Frage gibt.

In der heutigen Umgebung haben wir ein großes Konglomerat aus unterschiedlicher Hard- und Software - einige davon sind 32-Bit-, andere 64-Bit-, einige sind auf dem neuesten Stand und einige sind bewährt - zuverlässig und ändern sich nie ... _. Hinzu kommt eine Vielzahl von älterer und neuerer Hardware, älteren und neueren Betriebssystemen, verschiedenen Herstellern (Windows, Unixes, Apple usw.) und einer Vielzahl von Hilfsprogrammen und Servern, die mitgehen .. __ Da Hardware verbessert wurde und die Software auf 64-Bit-Kompatibilität umgestellt wurde, Es hat notwendigerweise eine beträchtliche Verzögerung gegeben, um alle Teile dieser sehr großen und komplexen Welt dazu zu bringen, mit dem raschen Tempo der Verä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 einigen sehr großen Dateien. Das Ergebnis sind nur etwa 400 Dateien, die ein 3 TB - Laufwerk füllen. Nur 1% der Inodes werden verwendet, aber 95% des gesamten Speicherplatzes. Jemanden mit vielen kleineren Dateien kann die Inodes leer werden, bevor sie sich dem Speicherplatz nähern. (Bei ext4-Dateisystemen gilt als Faustregel 1 Inode für jede Datei/jedes Verzeichnis.) 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 realistisch ist Einheiten, nicht nur Dateisystemfunktionen.

Ich hoffe, dass alle oben genannten Antworten das Denken und Problemlösen gefördert haben, anstatt ein unüberwindliches Hindernis für den Fortschritt darzustellen.

1
computersavvy

Ich hatte das gleiche Problem. Versucht, Millionen von Dateien auf einem Ubuntu-Server in ext4 zu speichern. Beendete meine eigenen Benchmarks. Sie haben herausgefunden, dass ein flaches Verzeichnis bessere Ergebnisse erzielt und dabei wesentlich einfacher zu bedienen ist:

 benchmark

Schrieb einen Artikel .

0
Hartator

Es gibt keine einzelne Zahl, die "zu viele" ist, solange sie die Grenzen des Betriebssystems nicht überschreitet. Je mehr Dateien sich jedoch in einem Verzeichnis befinden, unabhängig vom Betriebssystem, desto länger dauert der Zugriff auf die einzelnen Dateien. Bei den meisten Betriebssystemen ist die Leistung nicht linear, sodass das Finden einer Datei von 10.000 Dateien mehr als zehnmal länger dauert 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 Erweiterungsfehler bei der Wildcard. Um das Risiko zu verringern, sollten Sie Ihre Verzeichnisse nach dem Datum des Uploads oder nach anderen nützlichen Metadaten ordnen. 

0
Paul Smith

Keine Antwort, sondern nur ein paar Vorschläge.

Wählen Sie ein passenderes FS (Dateisystem). Da aus historischer Sicht alle Ihre Fragen klug genug waren, um einmal ein zentrales Element der sich über Jahrzehnte entwickelnden FS zu sein. Ich meine, moderner FS Ihre Fragen besser zu unterstützen. Erstellen Sie zunächst eine Vergleichsentscheidungstabelle basierend auf Ihrem endgültigen Zweck aus FS list .

Ich denke, es ist an der Zeit, Ihre Paradigmen zu ändern. Ich schlage daher persönlich vor, ein verteiltes System zu verwenden FS , was keinerlei Einschränkungen hinsichtlich Größe, Anzahl der Dateien usw. bedeutet. Andernfalls werden Sie früher oder später durch neue unerwartete Probleme angegriffen.

Ich bin nicht sicher zu arbeiten, aber wenn Sie kein Experiment erwähnen, versuchen Sie es mit AUFS über Ihr aktuelles Dateisystem. Ich vermute, es verfügt über Möglichkeiten, mehrere Ordner als einen einzelnen virtuellen Ordner nachzuahmen.

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

0
shvahabi