Frage

Ich habe einige in einem DB gespeicherten Daten, dass ich zu verarbeiten will. DB-Zugriff ist sehr langsam, so dass ich beschlossen, alle Daten in einem Wörterbuch vor der Verarbeitung zu laden. Doch aufgrund der enormen Größe der Daten gespeichert sind, habe ich nicht genügend Arbeitsspeicher Fehlermeldung erhalten (ich sehe mehr als 2 Gigs verwendet wird). Also habe ich beschlossen, eine Plattendatenstruktur zu verwenden, und fand heraus, dass shelve mit Option. Hier ist, was ich tun (pseudo Python-Code)

def loadData():
    if (#dict exists on disk):
        d = shelve.open(name)
        return d
    else:
        d = shelve.open(name, writeback=True)
        #access DB and write data to dict
        # d[key] = value 
        # or for mutable values
        # oldValue = d[key]
        # newValue = f(oldValue)
        # d[key] = newValue 
        d.close()
        d = shelve.open(name, writeback=True)
        return d

Ich habe ein paar Fragen,

1) Muss ich wirklich die Writeback = True? Was ist zu tun?

2) habe ich noch eine OutofMemory Ausnahme erhalten, da ich üben keine Kontrolle darüber, wann die Daten auf die Festplatte geschrieben wird. Wie mache ich das? Ich versuchte, ein sync () alle paar Wiederholungen zu tun, aber das hat nicht geholfen entweder.

Danke!

War es hilfreich?

Lösung

writeback=True Kräfte das Regal je geholt ein beliebiges Element im Speicher zu halten, und schreibt sie zurück, wenn das Regal geschlossen ist. Also, es verbraucht viel mehr Speicher und verlangsamt Schließen.

Der Vorteil des Parameters ist, dass mit ihr Sie nicht müssen die verdrehten Code, den Sie in Ihrem Kommentar zeigen für veränderbare Elemente, deren Mutator ist ein Verfahren - nur

shelf['foobar'].append(23)

funktioniert (wenn shelf mit Writeback geöffnet wurde freigegeben), unter der Annahme, das Element am Schlüssel 'foobar' eine Liste natürlich, während es still No-operation (Verlassen der Artikel auf der Festplatte unverändert), wenn shelf ohne Rückschreibe eröffnet sein würde - - im letzteren Fall, dass Sie tatsächlich Code tun müssen,

thelist = shelf['foobar']
thelist.append(23)
shekf['foobar'] = thelist

im Geist Ihres Kommentars des -., Die stilistisch so etwas wie ein doofen ist

Da Sie sind Gedächtnisprobleme haben, ich auf jeden Fall empfehlen nicht mit dieser fragwürdigen Writeback-Option. Ich glaube, ich anrufen kann es „zweifelhaft“, da ich derjenige war vorzuschlagen und zunächst die Umsetzung, aber das war vor vielen Jahren, und ich habe vor allem, es zu tun bereut - es generalen mehr Verwirrung (als Q Beweise) als ermöglicht Eleganz und Handlichkeit mit dicts Code ursprünglich geschrieben Arbeit zu bewegen (was das erste Idiom verwenden würde, nicht die zweite, und somit muß, um Umschreiben mit Regalen ohne Rückverfolgungs verwendbar zu sein). Ach ja, sorry, es hat scheint eine gute Idee zu der Zeit.

Andere Tipps

das sqlite3 Modul zu verwenden ist wahrscheinlich die beste Wahl hier. Sie könnten in der Lage sein SQLite ganz im Speicher verwenden sowieso, da seine Speicherbedarf ohnehin ein wenig kleiner als die Verwendung von Python-Objekte sein könnten. Es ist im Allgemeinen eine bessere Wahl als die Verwendung von shelve sowieso; shelve Anwendungen pickle darunter, was selten ist, was Sie wollen.

Zur Hölle, Sie könnten nur Ihre gesamte bestehende Datenbank in eine SQLite-Datenbank konvertieren. SQLite ist schön und schnell.

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