Python-basierte Disk-Wörterbuch
-
03-07-2019 - |
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?
Lösung
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?
lesen Antwort auf diese Frage von GvR;) eine Million 32-Bit-Integer Sortierung in 2 MB RAM mit Python
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.