2009-03-12 3 views
4

J'ai un grand objet que je voudrais sérialiser sur le disque. Je trouve marshal fonctionne très bien et est gentil et rapide.Python: Incrémenter marshal/pickle un objet?

En ce moment je crée mon grand objet en appelant marshal.dump. Je voudrais éviter de tenir le grand objet en mémoire si possible - je voudrais le vider progressivement au fur et à mesure que je le construis. Est-ce possible?

L'objet est assez simple, un dictionnaire de tableaux.

Répondre

0

Cela dépend beaucoup de la façon dont vous construisez l'objet. Est-ce un tableau de sous-objets? Vous pouvez marshal/pickle chaque élément de tableau comme vous le construisez. Est-ce un dictionnaire? La même idée s'applique (touches marshal/pickle)

Si c'est juste un grand objet harry complexe, vous voudrez peut-être rassembler chaque pièce de l'objet, puis appliquer ce que votre processus de 'construction' est quand vous lisez retour à l'intérieur.

+0

J'ai mis à jour la question. L'objet est assez simple, un dictionnaire de tableaux. Chaque tableau est assez petit.Est-ce que je rassemblerais chaque tableau individuel? Dans le même fichier? – Parand

0

Vous devriez être en mesure de vider l'élément pièce par pièce dans le fichier. Les deux questions de conception à régler sont les suivantes:

  1. Comment construisez-vous l'objet lorsque vous le mettez en mémoire?
  2. Comment avez-vous besoin de vos données quand elles ne sont plus en mémoire?

Si votre processus de construction remplit l'ensemble du réseau associé à une clé donnée à un moment, vous pourriez jeter la clé: paire de tableau dans un fichier comme un dictionnaire séparé:

big_hairy_dictionary['sample_key'] = pre_existing_array 
marshal.dump({'sample_key':big_hairy_dictionary['sample_key']},'central_file') 

ensuite sur la mise à jour , chaque appel à marshal.load ('fichier_central') renverra un dictionnaire que vous pourrez utiliser pour mettre à jour un dictionnaire central. Mais cela ne va vraiment être utile que si, lorsque vous avez besoin des données, vous voulez gérer la lecture de "fichier_central" une fois par clé.

Alternativement, si vous peuplez élément de tableaux élément par élément sans ordre particulier, peut-être essayer:

big_hairy_dictionary['sample_key'].append(single_element) 
marshal.dump(single_element,'marshaled_files/'+'sample_key') 

Ensuite, lorsque vous chargez en arrière, vous ne devez pas nécessairement pour construire le dictionnaire entier pour obtenir de retour ce dont tu as besoin vous appelez marshal.load ('marshaled_files/sample_key') jusqu'à ce qu'il renvoie None, et vous avez tout associé à la clé.

4

Les fonctions 'hashopen' et 'btopen' du module bsddb fournissent une interface persistante de type dictionnaire. Peut-être pourriez-vous utiliser l'un d'entre eux, au lieu d'un dictionnaire ordinaire, pour sérialiser de façon incrémentielle les tableaux sur disque?

import bsddb 
import marshal 

db = bsddb.hashopen('file.db') 
db['array1'] = marshal.dumps(array1) 
db['array2'] = marshal.dumps(array2) 
... 
db.close() 

Pour récupérer les tableaux:

db = bsddb.hashopen('file.db') 
array1 = marshal.loads(db['array1']) 
... 
4

Tout votre objet doit faire est d'être un dictionnaire de listes, vous pourrez peut-être utiliser le shelve module. Il présente une interface de type dictionnaire dans laquelle les clés et les valeurs sont stockées dans un fichier de base de données plutôt qu'en mémoire. Une limitation qui peut ou ne peut pas vous affecter est que les clés dans les objets Shelf doivent être des chaînes. Le stockage de la valeur sera plus efficace si vous spécifiez le protocole = -1 lors de la création de l'objet Shelf pour qu'il utilise une représentation binaire plus efficace.

+0

pourquoi cela n'a-t-il pas été marqué correctement? Pour ajouter à cette réponse, assurez-vous de connaître la réécriture/la mutabilité de l'objet mis en suspens. – Karthick

Questions connexes