Platzieren Sie viele (10 Millionen) Dateien in einem Ordner

17

Ich habe meiner Site gerade eine Funktion für die vorausschauende Suche (siehe Beispiel unten) hinzugefügt, die auf einem Ubuntu-Server ausgeführt wird. Dies wird direkt aus einer Datenbank ausgeführt. Ich möchte das Ergebnis für jede Suche zwischenspeichern und verwenden, wenn es vorhanden ist, sonst erstellen.

Würde es ein Problem geben, wenn ich die potenziellen 10 Millionen Ergebnisse in separaten Dateien in einem Verzeichnis speichere? Oder ist es ratsam, sie in Ordner aufzuteilen?

Beispiel:

Kohjah Breese
quelle
5
Es wäre besser, sich zu trennen. Jeder Befehl, der versucht, den Inhalt dieses Verzeichnisses aufzulisten, entscheidet sich wahrscheinlich selbst zu schießen.
muru
8
Wenn Sie also bereits eine Datenbank haben, warum nicht? Ich bin mir sicher, dass das DBMS Millionen von Datensätzen im Vergleich zum Dateisystem besser verarbeiten kann. Wenn Sie mit dem Dateisystem nichts mehr zu tun haben, müssen Sie sich ein Aufteilungsschema mit einer Art Hash ausdenken. An diesem Punkt scheint es, als würde die Verwendung der Datenbank weniger Arbeit bedeuten.
Roadmr
3
Eine weitere Option zum Zwischenspeichern, die besser zu Ihrem Modell passt, ist das Speichern im Speicher oder das erneute Anzeigen. Sie sind Schlüsselwertspeicher (sie verhalten sich also wie ein einzelnes Verzeichnis und Sie greifen nur über den Namen auf Elemente zu). Redis ist persistent (es gehen keine Daten verloren, wenn es neu gestartet wird), während memcached für weitere temporäre Elemente vorgesehen ist.
Stephen Ostermiller
2
Hier gibt es ein Henne-Ei-Problem. Tool-Entwickler verarbeiten keine Verzeichnisse mit einer großen Anzahl von Dateien, weil die Leute das nicht tun. Und die Leute erstellen keine Verzeichnisse mit einer großen Anzahl von Dateien, weil Tools dies nicht gut unterstützen. Ich habe einmal verstanden (und ich glaube, dass dies immer noch zutrifft), dass eine Feature-Anfrage, eine Generator-Version von os.listdirin Python zu erstellen, aus diesem Grund rundweg abgelehnt wurde.
Aus eigener Erfahrung habe ich einen Bruch festgestellt, als ich 32.000 Dateien in einem einzigen Verzeichnis unter Linux 2.6 bearbeitet habe. Es ist natürlich möglich, über diesen Punkt hinaus zu stimmen, aber ich würde es nicht empfehlen. Teilen Sie es einfach in ein paar Schichten von Unterverzeichnissen auf und es wird viel besser. Persönlich würde ich es auf ungefähr 10.000 pro Verzeichnis begrenzen, das Ihnen 2 Schichten geben würde.
Wolph

Antworten:

25

Wäre es problematisch, wenn ich die potenziellen ca. 10 Millionen Ergebnisse in separaten Dateien in einem Verzeichnis speichern würde?

Ja. Es gibt wahrscheinlich noch mehr Gründe, aber diese kann ich auf den Kopf stellen:

  • tune2fshat eine Option mit dem Namen dir_index, die standardmäßig aktiviert ist (unter Ubuntu ist dies der Fall), mit der Sie ungefähr 100.000 Dateien in einem Verzeichnis speichern können, bevor die Leistung beeinträchtigt wird. Das entspricht nicht einmal den 10-Millionen-Dateien, über die Sie nachdenken.

  • extDateisysteme haben eine feste maximale Anzahl von Inodes. Jede Datei und jedes Verzeichnis verwendet 1 Inode. Verwenden Sie df -ifür eine Ansicht Ihrer Partitionen und Inodes kostenlos. Wenn Sie keine Inodes mehr haben, können Sie keine neuen Dateien oder Ordner erstellen.

  • Befehle wie rmund lsbei Verwendung von Platzhaltern erweitern den Befehl und führen zu einer "Argumentliste zu lang". Sie müssen verwenden find, um Dateien zu löschen oder aufzulisten. Und findneigt dazu, langsam zu sein.

Oder ist es ratsam, sie in Ordner aufzuteilen?

Ja. Ganz sicher. Grundsätzlich können Sie nicht einmal 10 Millionen Dateien in einem Verzeichnis speichern.

Ich würde die Datenbank benutzen. Wenn Sie es für eine Website zwischenspeichern möchten, werfen Sie einen Blick auf " solr " ("Bereitstellung verteilter Indizierung, Replikation und Lastausgleichsabfrage ").

Rinzwind
quelle
8

Endete mit dem gleichen Problem. Führen Sie meine eigenen Benchmarks aus, um herauszufinden, ob Sie alles in demselben Ordner ablegen können, anstatt mehrere Ordner zu haben. Es scheint, Sie können und es ist schneller!

Benchmark

Siehe: https://medium.com/@hartator/benchmark-deep-directory-structure-vs-flat-directory-structure-to-store-millions-of-files-on-ext4-cac1000ca28

Hartator
quelle
1
Danke, das ist sehr nützlich. Ich verwende dies auf einer Site und es war ein echtes Problem, diesen Teil neu zu programmieren, um /abc/efg.html Verzeichnisstrukturen zu haben. Also werde ich in Zukunft wieder in ein flaches Verzeichnis wechseln.
Kohjah Breese
0

Eine binäre Suche kann problemlos Millionen von Datensätzen verarbeiten, sodass das Durchsuchen eines einzelnen Verzeichnisses kein Problem darstellt. Das geht sehr schnell.

Wenn Sie ein 32-Bit-System verwenden, ist die binäre Suche mit bis zu 2 GB Datensätzen einfach und gut.

Berekely DB, eine Open-Source-Software, würde es Ihnen ohne weiteres ermöglichen, das gesamte Ergebnis unter einem Eintrag zu speichern und die Suche zu integrieren.

Ashok Chand Mathur
quelle