Domanda

Ho dei dati memorizzati in un DB che voglio processo. accesso DB è penosamente lento, così ho deciso di caricare tutti i dati in un dizionario prima di qualsiasi elaborazione. Tuttavia, a causa della enorme dimensione dei dati memorizzati, ottengo un errore di memoria (che vedo più di 2 concerti in uso). Così ho deciso di utilizzare una struttura di dati su disco, e ha scoperto che l'uso di ripiano è un'opzione. Ecco quello che faccio (pseudo codice Python)

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

Ho un paio di domande,

1) Ho davvero bisogno del writeback = True? Che cosa fa?

2) Ho ancora ottenere un'eccezione OutofMemory, dal momento che non esercita alcun controllo su quando i dati vengono scritti su disco. Come lo faccio? Ho provato a fare una sincronizzazione () ogni poche iterazioni, ma questo non ha aiutato neanche.

Grazie!

È stato utile?

Soluzione

forze writeback=True il ripiano da tenere a memoria qualsiasi elemento mai inverosimile, e scrivere indietro quando il ripiano è chiusa. Quindi, si consuma molta più memoria, e rallenta la chiusura.

Il vantaggio del parametro è che, con esso, si non è necessario il codice contorto si mostra nel tuo commento per gli oggetti mutabili cui mutatore è un metodo - solo

shelf['foobar'].append(23)

funziona (se shelf è stato aperto con writeback abilitato), assumendo la voce a 'foobar' chiave è un elenco, naturalmente, mentre sarebbe in silenzio un no-operation (lasciando la voce su disco invariato) se shelf è stato aperto senza ripresa di valore - - in quest'ultimo caso che effettivamente c'è bisogno di codice

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

nello spirito del tuo commento -. Che è stilisticamente un po 'di delusione

Tuttavia, dal momento che sono avere problemi di memoria, vi consiglio caldamente non di utilizzare questa opzione writeback dubbia. Credo di poter chiamare "dubbie" da quando io ero quello che propone e la prima attuazione, ma che era molti anni fa, e ho per lo più pentito di farlo - è Generales più confusione (come le vostre testimonianze Q) di quanto non lo permette eleganza e praticità nel codice scritto originariamente per lavorare con dicts movimento (che utilizza il primo linguaggio, non il secondo, e quindi necessario riscrivere per essere utilizzabile con ripiani senza traceback). Ah bene, mi dispiace, ha sembra una buona idea, al momento.

Altri suggerimenti

Con il modulo sqlite3 è probabilmente la scelta migliore qui. Potreste essere in grado di utilizzare SQLite interamente in memoria comunque dato la sua impronta di memoria potrebbe essere un po 'più piccolo rispetto all'utilizzo di oggetti Python comunque. E 'generalmente una scelta migliore rispetto all'utilizzo di shelve comunque; usi shelve pickle sotto, che raramente è ciò che si desidera.

L'inferno, si può solo convertire l'intero database esistente in un database SQLite. SQLite è piacevole e veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top