3 Stimmen

Zwischenspeicherung großer Daten im Prozessspeicher

Ich bin in der Finanzbranche tätig. Wir wollen einen Datenbank-Hit für die Datenverarbeitung einführen. Das ist sehr kostspielig. Daher planen wir, eine On-Demand-Cache-Logik zu verwenden. [Runtime Insert & Runtime Lookup].

Hat jemand an der Implementierung der Caching-Logik für mehr als 10 Millionen Datensätze gearbeitet? Pro Datensatz ist sagen wir etwa 160 - 200 Bytes.

Bei den verschiedenen Ansätzen hatte ich folgende Nachteile.

  1. Kann nicht verwendet werden stl std::map um eine Cache-Registrierung für die Schlüsselbasis zu implementieren. Das Einfügen und Nachschlagen ist nach 200000 Datensätzen sehr langsam.
  2. Gemeinsamer Speicher oder abgebildeter Speicher Dateien sind eine Art Overhead für die Zwischenspeicherung von Daten, weil diese Daten nicht prozessübergreifend genutzt werden
  3. Verwendung von sqlite3 In-Memory & Flatfile Anwendungsdatenbank kann wert sein. Aber auch sie haben langsame Lookup nach einem 2-3 Millionen von Datensätzen.
  4. Der Prozessspeicher hat möglicherweise eine Begrenzung für seinen eigenen Kernel-Speicherverbrauch. Annahme ist 2 Gig auf 32-Bit-Maschinen und 4 Gig auf 64-Bit-Maschinen.

Bitte schlagen Sie mir etwas vor, wenn Sie auf dieses Problem gestoßen sind und es auf irgendeine Weise gelöst haben.

Gracias

2voto

Cory Nelson Punkte 28018

Wenn Ihr Cache ein einfacher Key-Value-Speicher ist, sollten Sie nicht mit std::map die über O (log n ) nachschlagen, aber std::unordered_map die über O (1) Nachschlagen. Sie sollten nur verwenden std::map wenn Sie eine Sortierung benötigen.

Es klingt so, als wäre Leistung das, was Sie suchen, also sollten Sie sich vielleicht mit Boost Intrusive . Sie können leicht kombinieren unordered_map y list um ein hocheffizientes LRU zu erstellen.

1voto

Daniel Mošmondor Punkte 19346

Lesen Sie alles in den Speicher und erstellen Sie einen R&B-Baum für den Schlüsselzugriff.

http://www.mit.edu/~emin/source_code/cpp_trees/index.html

Bei einem kürzlich durchgeführten Projekt hatten wir eine Datenbank mit mehreren 10 Millionen Datensätzen und verwendeten eine solche Strategie.

Ihr Datengewicht beträgt 2 GB, wie aus Ihrem Beitrag hervorgeht. Mit Overhead wird es etwa das Doppelte sein. Das ist kein Problem für jede 64bit-Architektur.

1voto

Ich habe kürzlich die Speicherzuweisung unseres Produkts (medizinischer 3D-Volumenbetrachter) geändert, um die guten alten Memory-Mapped-Dateien zu verwenden.

Die Vorteile waren:

  • Ich kann den gesamten physischen Arbeitsspeicher zuweisen, wenn ich möchte (meine 32-Bit-Anwendung benötigt manchmal mehr als 4 Gigabyte auf einem 64-Bit-Rechner)
  • Wenn Sie nur Teile davon abbilden, ist der Adressraum für Ihre Anwendung weitgehend frei, was die Zuverlässigkeit erhöht.
  • Wenn der Arbeitsspeicher knapp wird, verlangsamt sich alles, es kommt zu keinen Abstürzen.

In meinem Fall waren es nur Daten (meist schreibgeschützt). Wenn Sie eine komplexere Datenstruktur haben, wird dies mehr Arbeit bedeuten als die Verwendung "normaler" Objekte.

Sie können diese sogar prozessübergreifend nutzen (wenn sie durch eine echte Datei gesichert sind). Dies kann sich anders verhalten, ich habe keine Erfahrung damit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X