2009-06-26 14 views
4

In Bezug auf Leistung und Effizienz, ist es besser, viele kleine Dateien zu verwenden (für viele, ich meine so viel wie ein paar Millionen) oder ein paar (zehn oder so) riesige (mehrere Gigabyte) Dateien? Sagen wir einfach, ich baue eine Datenbank (nicht ganz richtig, aber alles, was zählt, ist, dass auf sie viel zugegriffen wird).Viele kleine Dateien oder ein paar große?

Ich bin hauptsächlich mit Leseleistung betroffen. Mein Dateisystem ist derzeit ext3 auf Linux (Ubuntu Server Edition, wenn es darauf ankommt), obwohl ich in einer Position bin, wo ich noch wechseln kann, so dass Vergleiche zwischen verschiedenen Dateisystemen fabelhaft wären. Aus technischen Gründen kann ich dafür kein DBMS verwenden (daher die Frage), daher ist "nur MySQL verwenden" keine gute Antwort.

Vielen Dank im Voraus, und lassen Sie mich wissen, wenn ich genauer sein muss.


EDIT: Ich werde viele relativ kleine Stücke von Daten zu speichern, weshalb viele kleine Dateien mit für mich wäre einfacher. Wenn ich also ein paar große Dateien verwenden würde, würde ich nur einige KB gleichzeitig abrufen. Ich würde auch einen Index verwenden, also ist das nicht wirklich ein Problem. Außerdem zeigen einige der Daten auf andere Datenelemente hin (dies würde auf die Datei im Fall der Particle-of-Small-Files verweisen und auf den Speicherort der Daten innerhalb der Datei im Fall der Großdateien verweisen).

+1

Je unbestimmter die Information ist, desto mehr wirst du bekommen, 'es kommt darauf an' – McAden

+3

Nun, welche anderen Informationen sollte ich hinzufügen? Ich kann mir nichts anderes vorstellen, was der Frage nützen würde. –

+0

Das Zugriffsprofil dieser Daten macht einen großen Unterschied. Werden Sie große Datenmengen lesen? Gibt es einige Daten, auf die am ehesten zugegriffen werden kann? Irgendwann ist es besser für Sie, eine DB statt vieler kleiner Dateien zu verwenden, es sei denn, Sie tun etwas, das EASY ist, wie sie über http zu bedienen, und es muss wirklich schnell sein. – jamuraa

Antwort

5

Es gibt viele Annahmen hier, aber in jeder Hinsicht, Suche durch eine große Datei wird viel schneller sein als Durchsuchen einer Reihe von kleinen Dateien.

Nehmen wir an, Sie sind auf der Suche nach einer Zeichenfolge Text in einer Textdatei enthalten. Suche eine 1TB Datei wird viel schneller als Öffnen 1,000,000 MB Dateien und die Suche durch diese sein.

Jeder Dateiöffnungsvorgang braucht Zeit. Eine große Datei muss nur einmal geöffnet werden.

Und bei der Betrachtung Festplattenleistung, eine einzelne Datei ist viel wahrscheinlicher, contigously gespeichert werden als eine große Reihe von Dateien.

... Auch dies sind Verallgemeinerungen, ohne mehr über Ihre spezifische Anwendung zu wissen.

Genießen,

Robert C. Cartaino

+2

True, außer Sie können auswählen, welche kleine Datei durchsucht werden soll. Irgendwie. – DOK

3

Das Hauptproblem hier TMO ist über Indizierung. Wenn Sie Informationen in einer großen Datei ohne einen guten Index suchen, müssen Sie die gesamte Datei nach den richtigen Informationen durchsuchen, die lange dauern können. Wenn Sie glauben, dass Sie starke Indizierungsmechanismen erstellen können, dann sollten Sie mit der riesigen Datei gehen.

Ich würde diese Aufgabe lieber an ext3 delegieren, die ziemlich gut darin sein sollte.

edit:

Eine Sache nach betrachten zu diesen wikipedia article on ext3 ist, dass die Fragmentierung im Laufe der Zeit passiert. Wenn Sie also eine große Anzahl von kleinen Dateien haben, die einen erheblichen Prozentsatz des Dateisystems beanspruchen, werden Sie im Laufe der Zeit an Performance verlieren.

Der Artikel auch den Anspruch über 32k Dateien pro Verzeichnis Grenze (unter der Annahme eines Wikipedia-Artikel kann alles bestätigen) validieren

+0

Nun, ich hätte einen Index (wahrscheinlich im Speicher), wenn ich mit den riesigen Dateien ging. Es ist nicht so, dass ich jedes Mal, wenn ich 2KB Daten benötige, eine ganze 8GB-Datei durchforste. –

2

Ich glaube, Ext3 eine Grenze von etwa 32.000 Dateien/Verzeichnisse pro Verzeichnis hat. Wenn Sie die Millionen von Dateien routen, müssen Sie sie in vielen Verzeichnissen verteilen. Ich weiß nicht, was das für die Leistung bringen würde.

Meine Präferenz wäre für die verschiedenen großen Dateien. In der Tat, warum haben Sie überhaupt einige, außer sie sind eine Art von logisch getrennten Einheiten? Wenn du es immer noch aufteilst, nur um es zu teilen, sage ich, tu das nicht. Ext3 kann sehr große Dateien gut verarbeiten.

+0

Ah Mann, tut es? Wusste darüber nicht ... +1 –

+0

Auch, ja, ich würde die großen Dateien teilen, weil sie völlig unterschiedliche Arten von Daten enthalten. Aber alle Daten desselben Typs befinden sich in derselben Datei. –

3

Es hängt davon ab. Ja wirklich. Unterschiedliche Dateisysteme werden auf andere Weise optimiert, aber im Allgemeinen werden kleine Dateien effizient gepackt. Der Vorteil großer Dateien besteht darin, dass Sie nicht viel öffnen und schließen müssen. Öffnen und Schließen sind Vorgänge, die Zeit brauchen. Wenn Sie eine große Datei, die Sie normalerweise öffnen und schließen nur einmal und Sie suchen verwenden, um Vorgänge

Wenn Sie für die Lose-of-Dateien Lösung gehen, empfehle ich Ihnen, eine Struktur wie

b/a/bar 
b/a/baz 
f/o/foo 

, weil Sie Begrenzungen für die Anzahl der Dateien in einem Verzeichnis.

1

Ich arbeite mit einem System, das bis zu etwa 5 Millionen Dateien auf einem XFS-Dateisystem unter Linux speichert und keine Leistungsprobleme hatte. Wir verwenden nur die Dateien zum Speichern der Daten, wir durchsuchen sie nie vollständig, wir haben eine Datenbank zum Suchen und eines der Felder in einer Tabelle enthält eine GUID, die wir zum Abrufen verwenden. Wir verwenden genau zwei Ebenen von Verzeichnissen wie oben, wobei die Dateinamen die GUID sind, obwohl mehr verwendet werden könnte, wenn die Anzahl der Dateien noch größer wird. Wir haben uns für diesen Ansatz entschieden, um zu vermeiden, dass ein paar Terabyte mehr in der Datenbank gespeichert werden, die nur gespeichert/zurückgesendet und nie durchsucht werden müssen, und es hat für uns gut funktioniert. Unsere Dateien reichen von 1k bis etwa 500k.

Wir haben das System auch auf ext3 ausgeführt, und es funktioniert gut, obwohl ich nicht sicher bin, ob wir es jemals über eine Million Dateien geschoben haben. Wir müssten wahrscheinlich zu einem 3-Verzeichnis-System aufgrund der maximalen Dateien pro Verzeichnis Einschränkungen gehen.

Verwandte Themen