[Python-de] dictionary > hauptspeicher

Jochen Wersdörfer jochen-python at wersdoerfer.de
Don Sep 22 15:15:34 CEST 2005


Am Donnerstag, 22. September 2005 14:06 schrieb Gerhard Häring:
> Diez B. Roggisch wrote:
> >>
> >>Tjo, also irgendwie brauche ich da wohl eine Datenstruktur, die
> >>dann eben auf die Platte schreibt, sobald kein Hauptspeicher mehr
> >>da ist. Schön wäre natürlich, wenn nur selten vorkommende Strings
> >>auf Platte ausgelagert würden. Gibt es soetwas schon? Oder sollte
> >>man da Berkely DB oder etwas ähnliches verwenden?
> > 
> > 
> > Ja, sowas gibt: heisst datenbank :):) Ob berkleydb dabei gut genug ist - KA. [...]
> 
> Ich würde dafür SQLite nehmen. Die Dinger in eine Datenbanktabelle 
> schreiben, dann mit einem SELECT DISTINCT zurücklesen:

Ja, so ähnlich werde ich es machen. Einfach Feld als uniq erklären
und dann alles inserten. Dann sind die Einträge automatisch distinct.
 
> ...
> cur.execute("select distinct value from stringtable")
> for row in cur:
>      ...
> 
> wobei das anschließende Iterieren über den Cursor die rows "on-demand" 
> abholt, und nicht etwa alle auf einmal. Somit dürfte es da kein 
> Speicherproblem geben.

Ja, ich mache das momentan so:

def getAllRows():
    con, cur = getDB("blubber")
    cur.execute("select * from blub")
    while True:
        rows = cur.fetchmany(1000)
        if not rows: break
            else:
                for row in rows: yield row

Wobei man aufpassen muß, daß man dafür einen anderen Cursor verwendet,
als für die anderen Datenbankzugriffe, die man macht, während über den
Generator iteriert wird. Wenn man da den gleichen nimmt, kommt da
natürlich plötzlich nichts mehr zurück, weil eine andere Query ja
schon fertig ist :>.

Gruss,
Jochen