2009-08-26 9 views
1

J'utilise ZODB pour stocker des données qui existent dans la mémoire pour des raisons de persistance. Si le service avec les données en mémoire se bloque à chaque fois, le redémarrage chargera les données de ZODB plutôt que d'interroger des centaines de milliers de lignes dans une base de données MySQL.Python: taille de fichier ZODB en croissance - pas de mise à jour?

Il semble que chaque fois que j'économise, disons 500K de données à mon fichier de base de données, mon fichier .fs se développe de 500K, plutôt que de rester à 500K. A titre d'exemple:

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() 

Je veux écraser en continu les données dans la racine [ « data_db »] avec la valeur actuelle de MyDictionary. Quand j'imprime len (root ['data_db']), il imprime toujours le bon nombre d'éléments de mydictionary, mais chaque fois que ce code s'exécute (avec les mêmes données exactes) la taille du fichier augmente de 500K.

Est-ce que je fais quelque chose de mal ici?

Répondre

2

Lorsque les données de ZODB sont modifiées, elles sont ajoutées à la fin du fichier. Les anciennes données sont laissées là. Pour réduire la taille de fichier, vous devez "pack" manuellement la base de données.

Google est venu avec this mailing list post.

+1

Existe-t-il un autre système de stockage (peut-être natif de python) que vous pourriez recommander puisque tout ce que je veux faire est d'écraser les données stockées à chaque fois? Pickly fonctionnerait pour moi, mais les transactions semblent lentes quand j'ai un énorme ensemble de données (1M + entrées dans le dictionnaire) – sberry

+0

Comme Mark a dit, je considérerais sqlite. –

1

Étant donné que vous avez demandé à propos d'un autre système de stockage dans un commentaire, vous pouvez vous intéresser à SQLite.

Même si SQLite se comporte de la même manière en ajoutant d'abord des données, il offre la commande de vide pour récupérer l'espace de stockage inutilisé. A partir du Python API, vous pouvez soit utiliser le vacuum pragma pour le faire automatiquement, ou vous pouvez simplement exécuter the vacuum command.

+0

Um. SQLite n'augmente pas toujours la taille du fichier de base de données. Les pages vides sont réutilisées. C'est juste que le fichier ne rétrécira pas à moins d'exécuter la commande 'vacuum'. – tzot

Questions connexes