2010-02-21 16 views
7

Ich entwickle ein PHP-Projekt auf Linux-Plattform. Gibt es Nachteile, mehrere tausend Bilder in ein Verzeichnis zu stellen? Dies ist eine geschlossene Menge, die nicht wachsen wird. Die Alternative wäre, diese Dateien unter Verwendung der Verzeichnisstruktur basierend auf einer bestimmten ID zu trennen (auf diese Weise würden wir beispielsweise nur 100 in einem Verzeichnis angeben).Viele Dateien in einem Verzeichnis?

Ich stelle diese Frage, weil ich oft solche Trennung sehe, wenn ich Bilder URLs auf verschiedenen Seiten betrachte. Sie können sehen, dass die Verzeichnistrennung so erfolgt, dass sich nicht mehr als mehrere hundert Bilder in einem Verzeichnis befinden.

Was würde ich gewinnen, wenn ich nicht mehrere tausend Dateien (von nicht wachsender Menge) in einem Verzeichnis ablegen würde, sondern sie in Gruppen von z. 100? Lohnt es sich, Dinge zu verkomplizieren?

UPDATE:

  • Es wird keine programmatische Iteration über Dateien in einem Verzeichnis sein (nur ein direkten Zugang zu einem Bild von ihrem Dateiname ist), dass das Bild Satz betonen
  • Ich mag ist geschlossen. Es sind weniger als 5000 Bilder, und das ist es.
  • Es gibt keine logische Kategorisierung dieser Bilder
  • Menschen Zugang/browse nicht
  • Bilder haben eindeutige Dateinamen
  • OS erforderlich: Debian/Linux 2.6.26-2-686, Dateisystem: ext3

WERTVOLLEN INFORMATIONEN DER ANTWORTEN:

Warum trennt viele Dateien in verschiedenen Verzeichnissen:

  • „32k Dateien Limit pro Verzeichnis, wenn ext3 über nfs mit“
  • Performance Grund (Zugriffsgeschwindigkeit) [aber mehrere tausend Dateien für es ist schwer zu sagen, ob es sich lohnt, ohne Messung]

Antwort

2

In der Regel ist der Grund für eine solche Aufteilung die Leistung des Dateisystems. für einen geschlossenen Satz von 5000 Dateien Ich bin mir nicht sicher, es ist den Aufwand wert. Ich schlage vor, dass Sie den einfachen Ansatz versuchen, alle Dateien in ein Verzeichnis zu bringen, aber achten Sie auf die tatsächliche Zeit, die für den Zugriff auf die Dateien benötigt wird.

Wenn Sie sehen, dass es nicht schnell genug für Ihre Bedürfnisse ist, können Sie es teilen, wie Sie es vorgeschlagen haben.

Ich musste aus Performance Gründen selbst Dateien teilen. zusätzlich stieß ich auf 32k Dateien Limit pro Verzeichnis bei der Verwendung von ext3 über nfs (nicht sicher, ob es eine Grenze von nfs oder ext3 ist). das ist ein weiterer Grund, sich in mehrere Verzeichnisse aufzuteilen. In jedem Fall versuchen Sie mit einem einzigen Verzeichnis und nur teilen, wenn Sie sehen, es ist nicht schnell genug.

+1

'(nicht sicher, ob es ein Limit von nfs oder ext3 ist)' Es ist ein ext3-Limit. – thomasrutter

0

Der einzige Grund, warum ich mir vorstellen könnte, wo es schädlich wäre, wenn ich über das Verzeichnis iteriere. Mehr Dateien, bedeutet mehr Iterationen. Aber das ist im Grunde alles, was ich aus einer Programmierperspektive denken kann.

1

Ich denke, es zwei Aspekte auf diese Frage lautet:

  1. Ist das Linux-Dateisystem, das Sie effizient Verzeichnisse mit Tausenden von Dateien unterstützen werden. Ich bin kein Experte, aber ich denke, die neueren Dateisysteme werden keine Probleme haben.

  2. Gibt es Leistungsprobleme mit bestimmten PHP-Funktionen? Ich denke, dass der direkte Zugriff auf Dateien in Ordnung sein sollte, aber wenn Sie Verzeichnislisten erstellen, könnten Sie schließlich mit Zeit- oder Speicherproblemen rechnen.

7

Neben der schnelleren Dateizugriff durch Bilder in Unterverzeichnissen zu trennen, können Sie auch dramatisch die Anzahl der Dateien erweitern Sie, bevor man die natürlichen Grenzen des Dateisystems verfolgen können.

Ein einfacher Ansatz ist es, md5() der Dateiname, dann verwenden Sie die ersten n Zeichen als Verzeichnisnamen (zB substr(md5($filename), 2)). Dies gewährleistet eine einigermaßen gleichmäßige Verteilung (im Vergleich zu den ersten n Zeichen des geraden Dateinamens).

+0

In weiteren Ebenen von Unterverzeichnissen wären mehr als eine Ebene nützlich. Zum Beispiel: ./12/34/56/78/1234567890abc.jpg. –

+0

Ok, also MD5 wäre ein allgemeiner Ansatz. In meinem Fall habe ich bereits eine eindeutige ID, da jedes Bild genau einer Datenbankzeile zugeordnet ist (die natürlich die primäre Zeile hat). Ich denke, es ist ein typisches Szenario. – JohnM2

+1

Es ist eine Überlegung wert, dass diese Zahlen nicht so gleichmäßig verteilt sind wie MD5-Hashes. –

0

Mehrere tausend Bilder sind noch in Ordnung. Wenn Sie auf ein Verzeichnis zugreifen, liest das Betriebssystem die Auflistung seiner Dateien in Blöcken von 4K. Wenn Sie eine einfache Verzeichnisstruktur haben, kann es einige Zeit dauern, bis Sie die gesamte Dateiliste gelesen haben, wenn sich viele (z. B. hunderttausend) Dateien darin befinden.

1

Es gibt keinen Grund, diese Dateien in mehrere Verzeichnisse aufzuteilen, wenn Sie keine Dateinamenkonflikte erwarten und diese Bilder an keiner Stelle durchlaufen müssen.

Wenn Sie jedoch an eine suggestive Kategorisierung denken können, ist es keine schlechte Idee, die Bilder ein wenig zu sortieren, auch wenn es nur aus Wartungsgründen ist.

0

Wenn das Ändern des Dateisystems eine Option ist, würde ich empfehlen, dorthin zu wechseln, wo Sie alle Bilder in einem ReiserFS-Dateisystem speichern. Es ist hervorragend für schnelles Speichern/Zugriff auf viele kleine Dateien.

Wenn nicht, ist die Antwort von MightyE, sie in Ordner zu zerlegen, am logischsten und wird die Zugriffszeiten erheblich verlängern.

Verwandte Themen