2013-04-05 8 views
5

ich eine SQLite-Datenbank des Haltens (über SQLAlchemy) im Speicher Vorteil der Geschwindigkeitsvorteile nehmen will Datei, während ich durch einen einmaligen Prozess gehe Inhalt einzufügen, und dann Dump-Datei , gespeichert, um später verwendet zu werden.schnell eine Datenbank im Speicher Dumping

Betrachten sie eine Moor-Standard-Datenbank created in the usual way:

# in-memory database 
e = create_engine('sqlite://') 

Gibt es eine schnelle Weise seinen Inhalt auf der Disc zu bewegen, die nicht nur eine völlig neue Datenbank zu erstellen und manuell jeden Eintrag eingefügt?

EDIT:

Es gibt einige Zweifel, ob oder nicht würde ich keine Vorteile sehen auch eine In-Memory-Datenbank zu verwenden. Leider sehe ich bereits einen großen Zeitunterschied von etwa 120x.

Diese Verwirrung ist wahrscheinlich auf mich in der Frage etwas wichtiges Detail fehlt aus. Vermutlich auch wegen mangelndem Verständnis meinerseits bezüglich: Caches/Seitengrößen/etc. Erlauben Sie mir folgendes zu erarbeiten:

Ich führe Simulationen eines Systems durch, das ich eingerichtet habe, wobei jede Simulation die folgenden Phasen durchläuft:

  1. einige Anfragen an die Datenbank machen.
  2. Machen Sie Berechnungen/führen Sie eine Simulation basierend auf den Ergebnissen dieser Abfragen durch.
  3. insert neue Einträge in die Datenbank auf der Basis der neuesten Simulation.
  4. Sicherstellen, dass die Datenbank auf dem neuesten Stand mit den neuen Einträgen ist durch commit() laufen.

Während ich immer nur ein Dutzend machen oder so Einfügungen auf jedem Simulationslauf, ich laufe jedoch Millionen von Simulationen und die Ergebnisse jeder Simulation verfügbar sein müssen für zukünftige Simulationen stattfinden. Wie ich schon sagte, dieser Lesen und Schreibvorgang dauert erheblich länger beim Ausführen einer Datei-Backed-Datenbank; es ist der Unterschied zwischen 6 Stunden und einem Monat.

Hoffentlich klärt die Dinge. Ich kann ein einfaches Python-Skript zusammenfügen, um meinen Prozess bei Bedarf ein wenig weiter zu skizzieren.

Antwort

1

SQLAlchemy und SQLite wissen, wie zu zwischenzuspeichern und zu tun Batch-Einsätze gut.

Es gibt keine Vorteile bei der Verwendung einer In-Memory-SQLite-Datenbank, da diese Datenbank Seiten genauso verwendet wie die On-Disk-Version, und der einzige Unterschied besteht darin, dass diese Seiten schließlich auf die Festplatte für eine datenträgerbasierte Datenbank geschrieben werden . Der Unterschied in der Leistung ist nur das 1,5-fache, siehe SQLite Performance Benchmark -- why is :memory: so slow...only 1.5X as fast as disk?

Es gibt auch keine Möglichkeit, die In-Memory-Datenbank auf eine Disk-basierte Datenbank zu einem späteren Zeitpunkt zu verschieben, kurz von Abfragen auf der In-Memory-Datenbank ausgeführt wird und die Ausführung Batch fügt in die datenträgerbasierte Datenbank zwei separate Verbindungen ein.

+0

Ich habe die ursprüngliche Frage bearbeitet, die einige Ihrer Punkte behandelt. – JimmidyJoo

+0

Sie können keinen Datencache erstellen und die Daten im Speicher behalten, wo hilfreich? –

+0

Angenommen, ich verstehe Ihre Frage richtig, meine Antwort ist nein. Zugegebenermaßen verwende ich nicht alle Informationen, die ich in die Datenbank ablege, sondern ich * mache * jedoch eine Information aus jeder einzelnen vorherigen Simulation, die ausgeführt wurde. Meine Simulationen werden auch erheblich komplizierter, indem Daten aus der Vergangenheit auf kompliziertere Weise verwendet werden. Ich hatte gehofft, die verschiedenen Abfragebefehle von SQL zu benutzen, um mir dabei zu helfen. – JimmidyJoo

Verwandte Themen