2012-06-14 8 views
15

glaube, ich habe eine Datenmenge, die ein Array von 1E12 32-Bit-Ganzzahlen (4 TB) in einer Datei auf einem Dateisystem 4 TB HDD ext4 ..Linux: Large Int-Array: mmap vs Datei suchen?

berücksichtigen, dass die Daten am wahrscheinlichsten zufällig (oder zumindest gespeichert ist, scheint zufällig).

// pseudo-code 
for (long long i = 0; i < (1LL << 40); i++) 
    SetFileIntAt(i) = GetRandInt(); 

Des Weiteren der Ansicht, dass ich einzelne int Elemente in einer unvorhersehbaren Reihenfolge und dass der Algorithmus läuft auf unbestimmte Zeit (on-going es ist) lesen möchten.

// pseudo-code 
while (true) 
    UseInt(GetFileInt(GetRand(1<<40))); 

Wir sind auf Linux x86_64, gcc. Sie können System übernehmen hat 4 GB RAM (dh 1000x weniger als Datensatz)

Im folgenden werden zwei Möglichkeiten, um Architekt Zugang:

(A) mmap die Datei in einem 4 TB Speicherblock und den Zugang als ein int array

(B) öffne (2) die Datei und benutze seek (2) und read (2) um die Ints zu lesen.

Von A und B, die die bessere Leistung haben werden? Und warum?

Gibt es ein anderes Design, das eine bessere Leistung als A oder B bietet?

+2

Die Geschwindigkeit, mit der auf ein RAM zugegriffen wird, ist größer als die Geschwindigkeit, um auf HD zuzugreifen (in einigen Größenordnungen, da keine mechanischen Teile vorhanden sind). Wenn Sie keine Speicherprobleme haben, ist die Zuordnung aller Dateien im RAM die beste Lösung, die Sie haben können. Sie können auch Solid-State-Laufwerke in Betracht ziehen (die dem RAM sehr ähnlich sind). Wenn ein Direktzugriff tatsächlich einen Direktzugriff bedeutet, können Sie den Cache außerdem deaktivieren, um einige Leistungen zu verbessern (d. H. Wenn die Wahrscheinlichkeit, auf dasselbe Element zuzugreifen, sehr gering ist, ist es nicht sinnvoll, im Cache zu suchen). –

+0

@D. Cannone Den Cache für einen anderen Zweck zu behalten, wenn man wahlfrei zugreift, ist nur billiant, danke! – Benoit

+0

#C würde es aus dem Netzwerk mit einer Art Kernel-Bypass-Technologie laden (sagen wir RDMA auf infiniband). Es wird irgendwo zwischen A und B sein. – bobah

Antwort

1

Ich würde sagen, die Leistung sollte ähnlich sein, wenn der Zugriff wirklich zufällig ist. Das Betriebssystem verwendet eine ähnliche Cache-Strategie, ob die Datenseite aus einer Datei zugeordnet wird oder die Dateidaten einfach ohne Zuordnung zum RAM zwischengespeichert werden.

Unter der Annahme, Cache ist unwirksam:

  • Sie fadvise können Ihre Zugriffsmuster im Voraus und deaktivieren readahead zu erklären.
  • Aufgrund der Randomisierung des Adressraumlayouts ist möglicherweise kein zusammenhängender Block von 4 TB in Ihrem virtuellen Adressraum vorhanden.
  • Wenn Ihr Datensatz jemals erweitert wird, kann das Adressraumproblem dringlicher werden.

Also würde ich mit expliziten Lesevorgänge gehen.

3

Auf der einer Seite haben Sie umfangreiche Verwendung von Speichern Swap in kleineren PageFaults resultierenden, transparent für die applicative. Auf der anderen Seite haben Sie zahlreiche Systemaufrufe, mit dem bekannten Overhead. Die Wikipedia-Seite über memory-mapped file scheint mir ganz klar zu sein, sie durchsucht in umfassender Weise Vor- und Nachteile.

Ich denke, 64-Bit-Architektur + große Datei für eine Memory-Mapped-Datei-Ansatz, zumindest um die Anwendung zu komplexieren; Mir wurde gesagt, dass Komplexität oft zu schlechter Leistung führt. Für den sequentiellen Zugriff ist jedoch mmap() üblich, was hier nicht der Zweck ist.

Da dies reiner Direktzugriff ist, gibt es kaum eine Chance, dass zwei Zugriffe in derselben RAM-geladenen Seite sind. Eine volle 4kb-Seite wird von der Festplatte in den RAM-Speicher getauscht, nur für 4-Byte-Daten ... Dies ist nutzloses Laden von Bussen und wird wahrscheinlich zu schlechten Leistungen führen.

Hoffe diese Hilfe.

+0

Da keine Festplatte Lesen oder Schreiben von weniger als einem Block erlaubt, gibt es wirklich keine Möglichkeit, eine Platte weniger als 512 Bytes zu lesen, was auch immer Sie tun, auch wenn Sie Raw Access/Write a verwenden benutzerdefiniertes Betriebssystem usw. Das vom Dateisystem maximal zulässige Lesen ist möglicherweise höher. – camelccc

1

Wahrscheinlich für einen 4TB linearen Datensatz benötigen Sie kein Dateisystem. Ich schätze, ein raw-Gerätezugriff kann einige Leistungsvorteile bringen.

Auch gibt es wahrscheinlich eine Möglichkeit, die Abfragen oder die Datenstruktur zu optimieren, so dass Caching effizienter genutzt werden könnte?

+0

Was ist ein "linearer" Datensatz? –

+0

"linear" in einem Sinne, dass es ein einziges großes Array mit linearer Indizierung ist. Um das N-te Element zu erhalten, adressieren Sie es bei N * sizeof (element) offset. –

+0

Es wäre nicht linear, wenn es mehrere Arrays, plus einige Hash- oder btree-Indizes, Transaktionen usw. enthält. –

1

Suchleistung hängt stark von Ihrer Dateisystemimplementierung ab. Ext4 sollte eine gute Wahl sein, da es extent trees verwendet. Auch wenn Ihre Datei eine lineare zusammenhängende Zuweisung hat, wird der Erweiterungsbaum aus einem einzelnen Eintrag bestehen, was die Suche trivial effizient macht.