Der beste Weg, eine große Textdatei in Python zu speichern und zu verwenden

StackOverflow https://stackoverflow.com/questions/158546

  •  03-07-2019
  •  | 
  •  

Frage

Ich erstelle einen Netzwerkserver für einen Boggle-Clone, den ich in Python geschrieben habe, der Benutzer akzeptiert, die Boards löst und die Spielereingaben bewertet.Die von mir verwendete Wörterbuchdatei ist 1,8 MB groß (das ENABLE2K-Wörterbuch) und muss für mehrere Spielelöserklassen verfügbar sein.Im Moment habe ich es so eingerichtet, dass jede Klasse die Datei Zeile für Zeile durchläuft und eine Hash-Tabelle (assoziatives Array) generiert. Je mehr Solver-Klassen ich jedoch instanziiere, desto mehr Speicher wird beansprucht.

Ich möchte die Wörterbuchdatei einmal importieren und sie bei Bedarf an jede Solver-Instanz weitergeben.Aber wie geht das am besten?Soll ich das Wörterbuch in den globalen Bereich importieren und dann in der Solver-Klasse als globals()['dictionary'] darauf zugreifen?Oder sollte ich das Wörterbuch importieren und es dann als Argument an den Klassenkonstruktor übergeben?Ist eines davon besser als das andere?Gibt es eine dritte Option?

War es hilfreich?

Lösung

Wenn Sie ein dictionary.py-Modul erstellen, das Code enthält, der die Datei liest und ein Wörterbuch erstellt, wird dieser Code nur beim ersten Import ausgeführt.Weitere Importe geben einen Verweis auf die vorhandene Modulinstanz zurück.Somit können Ihre Kurse:

import dictionary

dictionary.words[whatever]

wo dictionary.py hat:

words = {}

# read file and add to 'words'

Andere Tipps

Obwohl es zu diesem Zeitpunkt im Wesentlichen ein Singleton ist, gelten die üblichen Argumente gegen Globale. Suchen Sie nach einem pythonischen Singleton-Substitut nach dem "Borg" -Objekt.

Das ist wirklich der einzige Unterschied. Sobald das Dictionary -Objekt erstellt wurde, verbinden Sie nur neue Referenzen, wenn Sie es weitergeben, es sei denn, Sie führen explizit eine tiefe Kopie aus. Es ist sinnvoll, dass es einmal und nur einmal zentral konstruiert ist, solange für jede Solver -Instanz keine private Kopie zur Änderung erforderlich ist.

Adam, denken Sie daran in Python, wenn Sie sagen:

a = read_dict_from_file()
b = a

... du bist eigentlich nicht Kopieren a, und damit mehr Speicher verwenden, machen Sie lediglich b Ein weiterer Hinweis auf dasselbe Objekt.

Also im Prinzip irgendein Die von Ihnen vorgeschlagenen Lösungen sind in Bezug auf die Speicherverwendung weitaus besser. Grundsätzlich lesen Sie im Wörterbuch einmal und dann an einen Verweis darauf. Unabhängig davon, ob Sie es mit einer globalen Variablen tun oder an jede Instanz weitergeben oder etwas anderes, werden Sie auf dasselbe Objekt verweisen und nicht duplizieren.

Welches ist am pythonischsten? Das ist eine ganze 'Nother Dose von Würmern, aber hier ist, was ich persönlich tun würde:

def main(args):
  run_initialization_stuff()
  dictionary = read_dictionary_from_file()
  solvers = [ Solver(class=x, dictionary=dictionary) for x in len(number_of_solvers) ]

HTH.

Abhängig von dem, was Ihr DICT enthält, interessieren Sie sich möglicherweise für die Module "Regal" oder "Anydbm". Sie geben Ihnen diktähnliche Schnittstellen (nur Strings als Schlüssel und Elemente für 'Anydbm' und Zeichenfolgen als Schlüssel und jedes Python-Objekt als Element für 'Regal'), aber die Daten befinden sich tatsächlich in einer DBM-Datei (GDBM, NDBM, DBHASH, BSDDB, abhängig von dem, was auf der Plattform verfügbar ist -Memory Bit.

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