2009-08-26 6 views
1

Ich verwende ZODB, um einige Daten zu speichern, die aus Gründen der Persistenz im Speicher vorhanden sind. Wenn der Dienst mit den Daten im Speicher alle abstürzt, werden beim Neustart die Daten von ZODB geladen, anstatt 100000 Zeilen in einer MySQL-Datenbank abzufragen.Python: ZODB Dateigröße wächst - nicht aktualisiert?

Es scheint, dass jedes Mal, wenn ich 500k Daten in meine Datenbankdatei speichern, meine .fs-Datei um 500K wächst, anstatt bei 500K zu bleiben. Als Beispiel:

storage  = FileStorage.FileStorage(MY_PATH) 
db   = DB(storage) 
connection = db.open() 
root  = connection.root() 

if not root.has_key('data_db'): 
    root['data_db'] = OOBTree() 
mydictionary = {'some dictionary with 500K of data'} 
root['data_db'] = mydictionary 
root._p_changed = 1 
transaction.commit() 
transaction.abort() 
connection.close() 
db.close() 
storage.close() 

Ich mag die Daten in root [ ‚data_DB‘] mit dem aktuellen Wert von MyDictionary kontinuierlich zu überschreiben. Wenn ich len (root ['data_db']) drucke, druckt es immer die richtige Anzahl von Elementen aus mydictionary, aber jedes Mal, wenn dieser Code ausgeführt wird (mit genau denselben Daten), wird die Dateigröße um die Datengröße erhöht, in diesem Fall 500K.

Mache ich hier etwas falsch?

Antwort

2

Wenn sich die Daten in ZODB ändern, wird sie an das Ende der Datei angehängt. Alte Daten sind dort geblieben. Um die Dateigröße zu reduzieren, müssen Sie die Datenbank manuell "packen".

Google kam mit this mailing list post.

+1

Gibt es ein anderes Speichersystem (möglicherweise nativ zu Python), das Sie vielleicht empfehlen, da ich nur die gespeicherten Daten jedes Mal überschreiben möchte? Pickly würde für mich arbeiten, aber die Transaktionen scheinen langsam, wenn ich eine riesige Menge von Daten habe (1M + Einträge im Wörterbuch) – sberry

+0

Wie Mark sagte, würde ich sqlite betrachten. –

1

Da Sie in einem Kommentar nach einem anderen Speichersystem gefragt haben, sollten Sie sich SQLite ansehen.

Auch wenn sich SQLite beim Anfügen an Daten zuerst verhält, bietet es den Vakuumbefehl, um ungenutzten Speicherplatz wiederherzustellen. Von der Python API können Sie entweder die vacuum pragma verwenden, um es automatisch zu tun, oder Sie können einfach the vacuum command ausführen.

+0

Um. SQLite erhöht nicht immer die Größe der Datenbankdatei. Geleerte Seiten werden wiederverwendet. Es ist nur so, dass die Datei nicht schrumpft, wenn Sie nicht den Befehl 'Vakuum' ausführen. – tzot

Verwandte Themen