Optimale Möglichkeit, 70.000 statische Dateien (jpg) bereitzustellen?

Optimale Möglichkeit, 70.000 statische Dateien (jpg) bereitzustellen?

Ich muss mit nginx etwa 70.000 statische Dateien (jpg) bereitstellen. Soll ich sie alle in ein einziges Verzeichnis legen oder gibt es einen besseren (effizienteren) Weg? Da die Dateinamen numerisch sind, habe ich über eine Verzeichnisstruktur wie diese nachgedacht:

xxx/xxxx/xxx

Das Betriebssystem ist CentOS 5.1

Antwort1

Benchmark, Benchmark, Benchmark! Sie werden wahrscheinlich findenkein signifikanter Unterschiedzwischen den beiden Optionen, was bedeutet, dass Sie Ihre Zeit besser für andere Probleme verwenden können. Wenn Sie einen Benchmark durchführen und keinen wirklichen Unterschied feststellen, wählen Sie das einfachere Schema – das, was einfach zu codieren ist, wenn nur Programme auf die Dateien zugreifen müssen, oder das, womit Menschen einfach arbeiten können, wenn sie häufig mit den Dateien arbeiten müssen.

Was die schnellere Methode betrifft, so ist die Suchzeit für Verzeichnisse meines Erachtens proportional zum Logarithmus der Anzahl der Dateien im Verzeichnis. Daher ist jede der drei Suchvorgänge für die verschachtelte Struktur schneller als eine große Suche, aber die Summe aller drei Suchvorgänge wird wahrscheinlich größer sein.

Aber vertrauen Sie mir nicht, ich habe keine Ahnung, was ich tue!Leistung messenwenn es darauf ankommt!

Antwort2

es hängt wirklich von dem Dateisystem ab, das Sie zum Speichern der Dateien verwenden.

Einige Dateisysteme (wie ext2 und in geringerem Maße ext3) sind schrecklich langsam, wenn Sie Tausende von Dateien in einem Verzeichnis haben. Daher ist die Verwendung von Unterverzeichnissen eine sehr gute Idee.

Andere Dateisysteme wie XFS oder Reiserfs(*) werden durch Tausende von Dateien in einem Verzeichnis nicht langsamer. Daher spielt es keine Rolle, ob Sie ein großes Verzeichnis oder viele kleinere Unterverzeichnisse haben.

(*) Reiserfs hat einige nette Funktionen, ist jedoch ein experimentelles Spielzeug mit einer Geschichte katastrophaler Fehler. Verwenden Sie es nicht für Dinge, die auch nur annähernd wichtig sind.

Antwort3

Wie andere bereits gesagt haben, ist Verzeichnis-Hashing höchstwahrscheinlich die beste Lösung.

Ich würde Ihnen jedoch empfehlen, Ihre URIsunabhängigvon welchem ​​Verzeichnisschema Sie auch immer verwenden, mit dem Rewrite-Modul von nginx, z. B. mappen Sie example.com/123456.jpg nach /path/12/34/123456.jpg

Wenn Ihre Verzeichnisstruktur dann aus Leistungsgründen geändert werden muss, können Sie dies tun, ohne Ihre veröffentlichten URIs zu ändern.

Antwort4

Sie könnten einen Squid-Cache vor Ihren Nginx-Server stellen. Squid kann die beliebten Bilder entweder im Speicher behalten oder sein eigenes Dateilayout für schnelles Nachschlagen verwenden.

Bei Squid beträgt der Standardwert 16 Verzeichnisse der Ebene 1 und 256 Verzeichnisse der Ebene 2. Dies sind sinnvolle Standardwerte für meine Dateisysteme.

Wenn Sie kein Produkt wie Squid verwenden und Ihre eigene Dateistruktur erstellen, müssen Sie sich einen sinnvollen Hash-Algorithmus für Ihre Dateien ausdenken. Wenn die Dateinamen zufällig generiert werden, ist das einfach, und Sie können den Dateinamen selbst verwenden, um die Dateien in Buckets aufzuteilen. Wenn alle Ihre Dateien wie IMG_xxxx aussehen, müssen Sie entweder die niedrigstwertigen Ziffern verwenden oder den Dateinamen hashen und basierend auf dieser Hash-Nummer aufteilen.

verwandte Informationen