2009-05-20 7 views
0

Ich erstelle eine Anwendung, die an andere Wissenschaftler verteilt werden soll. Die Anwendung nimmt drei vom Benutzer übermittelte Parameter entgegen und gibt eine Liste von Daten und Codes aus, die sich auf diese Ereignisse beziehen. Ich habe das mit einem Dictionary erstellt und wollte die Anwendung so erstellen, dass das Dictionary aus einer Pickle-Datei geladen wurde, wenn die Anwendung danach verlangte. Die vom Benutzer bereitgestellten Parameter werden zum Suchen der benötigten Ausgabe verwendet.Was ist die am wenigsten ressourcenintensive Datenstruktur, die mit einer Python-Anwendung verteilt werden soll?

Ich habe diese Struktur ausgewählt, weil ich mich mit Wörterbüchern und Pickle-Dateien ziemlich wohl gefühlt habe, und ich sehe, dass dies mit der kleinsten Lernkurve von mir ausgeht. Es kann bis zu zwei Millionen Schlüssel im Wörterbuch geben. Ich war mit der Leistung meiner Maschine mit einer vernünftigen Untermenge zufrieden. Ich habe schon darüber nachgedacht, wie ich das Wörterbuch auseinanderreißen kann, wenn ich irgendwelche Leistungsbedenken habe, wenn das Ganze zusammengefügt wird. Ich bin nicht wirklich besorgt über die Menge an Speicherplatz auf ihrer Maschine, da wir mit Terabyte Speicherwerten arbeiten.

Nachdem ich all das gesagt habe, stöbere ich in der Dokumentation herum und frage mich, ob ich etwas Zeit investieren muss, um eine alternative Datenspeicherdatei zu lernen und zu implementieren. Der einzige Grund, an den ich denken kann, ist, ob es eine Alternative gibt, die die Suchgeschwindigkeit um einen Faktor von drei bis fünf oder mehr erhöhen könnte.

+0

ich nicht ganz folgen. Beginnen Sie während der Ausführung mit dem Lesen der gesamten Datendatei im RAM oder möchten Sie Ihre Daten für jede Abfrage auf dem Datenträger nachschlagen? Möchten Sie eine schnellere Festplatte in den Arbeitsspeicher oder eine schnellere Benutzereingabe für die Programmausgabe? Es scheint, dass die meisten Antworten darauf abzielen, wie Sie Ihre Daten persistent machen, aber ich dachte, dass Ihre Frage war, wie man Suchvorgänge schneller machen kann? – tom10

Antwort

6

Das Standardmodul shelve bietet Ihnen ein persistentes Wörterbuch, das in einer dbm style-Datenbank gespeichert ist. Unter der Voraussetzung, dass Ihre Schlüssel Zeichenfolgen sind und Ihre Werte auswahlbar sind (da Sie bereits Beize verwenden, muss dies der Wahrheit entsprechen), könnte dies eine bessere Lösung sein, bei der einfach das gesamte Wörterbuch in einer einzigen Beize gespeichert wird.

Beispiel:

>>> import shelve 
>>> d = shelve.open('mydb') 
>>> d['key1'] = 12345 
>>> d['key2'] = value2 
>>> print d['key1'] 
12345 
>>> d.close() 

ich auch Durus empfehlen würde, aber das erfordert einige zusätzliche Lernen auf Ihrer Seite. Damit können Sie ein PersistentDictionary erstellen. Aus dem Speicher können Schlüssel ein beliebiges auswählbares Objekt sein.

+0

FYI: http://docs.python.org/library/shelve.html – user26294

0

Hier sind drei Dinge, die Sie ausprobieren können:

  1. des gebeizten Wörterbuch mit zlib komprimieren. pickle.dumps (dict) .encode ("zlib")
  2. Machen Sie Ihr eigenes Serialisierungsformat (sollte nicht zu schwer sein).
  3. Laden Sie die Daten in eine SQLite-Datenbank.
2

schnelle Lookups zu erhalten, verwenden Sie den Standard-Python dbm Modul (siehe http://docs.python.org/library/dbm.html) Ihre Datenbank-Datei zu erstellen, und tun Lookups darin. Das dbm-Dateiformat ist möglicherweise nicht plattformübergreifend, daher sollten Sie Ihre Daten in Pickle oder Repr oder JSON oder YAML oder XML formatieren und die dbm Datenbank erstellen, in der der Benutzer Ihr Programm ausführt.

2

Wie viel Speicher kann Ihre Anwendung sinnvoll nutzen? Wird dies auf dem Desktop eines jeden Benutzers ausgeführt, oder wird es nur eine Bereitstellung geben?

Ein Python-Wörterbuch im Speicher kann sicherlich mit zwei Millionen Schlüsseln umgehen. Sie sagen, dass Sie eine Teilmenge der Daten haben; Hast du die ganze Menge? Vielleicht solltest du den vollen Datensatz darauf werfen und sehen, ob es bewältigt.

Ich habe gerade das Erstellen eines zwei Millionen Wörterbuchs getestet; Die gesamte Speicherauslastung für den Prozess betrug etwa 200 MB.Wenn Geschwindigkeit Ihr wichtigstes Anliegen ist und Sie über genügend Arbeitsspeicher verfügen, werden Sie wahrscheinlich nicht besser als ein Python-In-Memory-Dictionary sein.

1

Sehen Sie diese Lösung bei SourceForge, esp. die „Endnoten“ Dokumentation:

y_serial.py Modul :: Lager Python-Objekte mit SQLite

„Serialisierung + persistance :: in wenigen Zeilen Code, komprimiert und mit Anmerkungen versehen Python-Objekte in SQLite, dann zu einem späteren Zeitpunkt abrufen chronologisch nach Schlüsselwörtern ohne SQL. Am nützlichsten "Standard" -Modul für eine Datenbank, um schemafreie Daten zu speichern. "

http://yserial.sourceforge.net

Verwandte Themen