Frage

Ich habe einigen dynamischen Programmcode ausgeführt wird (versucht Kraft Brute zu widerlegen die Collatz-Vermutung = P) und ich wurde mit einem dict der Längen der Ketten zu speichern hatte ich schon berechnet. Offensichtlich ist es lief irgendwann aus der Erinnerung. Gibt es eine einfache Möglichkeit, eine Variante eines dict die Seite Teile von mir aus auf der Festplatte zu verwenden, wenn sie aus dem Zimmer laufen? Offensichtlich wird es langsamer als ein In-Memory-dict, und es wird wahrscheinlich meinen Festplattenspeicher am Ende zu essen, aber dies auf andere Probleme anwenden könnte, das nicht so sinnlos.

erkennen ich, dass eine Disk-basierte Wörterbuch ziemlich ist eine Datenbank, so dass ich manuell implementiert einen sqlite3, aber ich habe es nicht in jede intelligenten Art und Weise tun und hatte es jedes Element in der DB einen nach dem anderen aufblicken ... es war etwa 300x langsamer.

Ist der cleverste Weg, nur meinen eigenen Satz von dicts zu erstellen, zu einem Zeitpunkt nur eine im Speicher zu halten und blättert sie in irgendeiner Art und Weise effizient aus?

War es hilfreich?

Lösung

mehr Optionen aufgelistet in dem Hash-Scheibe im Allgemeinen mit Berkeley DB oder etwas ähnliches gerichtet > Python Datenpersistenz Dokumentation . Sie können Front es mit einer In-Memory-Cache, aber ich würde testen gegen nativer Leistung zuerst; mit Betriebssystem-Caching an Ort und Stelle könnte es kommt etwa gleich.

Andere Tipps

Die 3rd party Schubs Modul lohnt sich auch ein Blick auf. Es ist sehr ähnlich ad acta zu legen, dass es ein einfaches dict artiges Objekt ist, aber es ist auf verschiedene Backends (wie Datei, SVN und S3) gespeichert werden kann, bietet optionale Komprimierung und ist sogar THREAD. Es ist ein sehr praktisches Modul

from shove import Shove

mem_store = Shove()
file_store = Shove('file://mystore')

file_store['key'] = value

Zuletzt war ich ein Problem wie diese gegenüber, ich schrieb SQLite zu verwenden, anstatt ein dict, und hatte eine massive Leistungssteigerung. Die Leistungssteigerung war zumindest teilweise aufgrund der Indizierung Fähigkeiten-Datenbank; Je nach Algorithmen, YMMV.

Eine dünne Hülle, die SQLite-Abfragen in __getitem__ und __setitem__ tut, ist nicht viel Code zu schreiben.

Der shelve Modul kann es tun; jedenfalls sollte es einfach zu testen sein. Statt:

self.lengths = {}

tun:

import shelve
self.lengths = shelve.open('lengths.shelf')

Der einzige Haken ist, dass die Schlüssel zu den Regalen Strings sein müssen, so dass Sie ersetzen müssen, werden

self.lengths[indx]

mit

self.lengths[str(indx)]

(Ich gehe davon aus Ihren Schlüsseln nur ganze Zahlen sind, wie pro Ihren Kommentar zu Charles Duffy post)

Es gibt keinen eingebauten Caching im Speicher, aber das Betriebssystem kann die sowieso für Sie tut.

[eigentlich ist das nicht ganz richtig: Sie können das Argument übergeben können ‚Writeback = True‘ auf Schöpfung. Die Absicht ist dies sicher Speicherlisten und andere veränderbare Dinge machen in dem Regal richtig funktioniert. Aber ein Nebeneffekt ist, dass das ganze Wörterbuch im Speicher zwischengespeichert. Da diese Probleme für Sie verursacht, ist es wahrscheinlich keine gute Idee :-)]

Mit ein wenig dachte, es scheint, wie Sie die Modul ad acta zu tun, was Sie wollen.

Ich habe gelesen, Sie denken, shelve zu langsam ist und Sie versucht, Ihren eigenen dict mit SQLite zu hacken.

Ein anderes tat dies auch:

http://sebsauvage.net/python/snyppets/index.html#dbdict

Es scheint ziemlich effizient (und sebsauvage ist ein ziemlich guter Coder). Vielleicht könnten Sie es versuchen?

Sie sollten bringen mehr als ein Element in einer Zeit, wenn es eine Heuristik ist zu wissen, welche sind die wahrscheinlichsten Elemente nächsten abgerufen werden, und vergessen Sie nicht, die Indizes wie Charles erwähnt.

Ich versuche es noch nicht, aber Hamster DB ist vielversprechend und hat eine Python-Schnittstelle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top