Chargement d'un gros dictionnaire à l'aide de python cornichon

J'ai plein d'index inversé, en forme de imbriquée python dictionnaire. Sa structure est :

{word : { doc_name : [location_list] } }

Par exemple laisser le dictionnaire être appelé index, puis du mot " spam ", entrée ressemblerait à :

{ spam : { doc1.txt : [102,300,399], doc5.txt : [200,587] } }

J'ai utilisé cette structure comme python dict sont assez optimisé, et il rend la programmation plus facile.

pour n'importe quel mot "spam", les documents contenant qui peut être donnée par :

index['spam'].keys()

et l'affichage d'une liste pour un document doc1 par:

index['spam']['doc1']

À l'heure actuelle, je suis en utilisant cPickle de stocker et de charger ce dictionnaire. Mais le marinés fichier est d'environ 380 MO et prend beaucoup de temps à charger - 112 secondes(approx. Je l'ai chronométré à l'aide de temps.time()) et l'utilisation de la mémoire va à 1,2 GO (moniteur système de Gnome). Une fois son chargement, de sa belle. J'ai 4 go de RAM.

len(index.keys()) donne 229758

Code

import cPickle as pickle

f = open('full_index','rb')
print 'Loading index... please wait...'
index = pickle.load(f)  # This takes ages
print 'Index loaded. You may now proceed to search'

Comment puis-je rendre le chargement plus rapide? J'ai seulement besoin de la charger une fois, lorsque l'application démarre. Après cela, le temps d'accès est important pour répondre à des requêtes.

Devrais-je passer à une base de données comme SQLite et de créer un index sur ses touches? Si oui, comment dois-je stocker les valeurs de disposer d'un schéma équivalent, ce qui rend la récupération facile. Est-il autre chose que je devrais regarder ?

Additif

À l'aide de Tim réponse pickle.dump(index, file, -1) la marinés fichier est considérablement plus petites autour de 237 MO (a pris 300 secondes pour vider)... et prend la moitié du temps à charger maintenant (61 secondes ... plutôt 112 s plus tôt .... temps.time())

Mais dois-je migrer vers une base de données pour l'évolutivité ?

Que pour l'instant je suis marquage de Tim réponse acceptée.

PS :je ne veux pas utiliser Lucene ou Xapian ...
Cette question fait référence Le stockage d'un index inversé . Je devais poser une nouvelle question, parce que je n'étais pas en mesure de supprimer le précédent.

S. Lott : ajout de la date
"Mais dois-je migrer vers une base de données pour l'évolutivité ?" Vous seul pouvez décider si le temps de chargement est un problème ou pas. Combien de fois avez-vous en charge? Le nombre de requêtes faites-vous fonctionner en comparaison avec le temps nécessaire pour charger? Cette ingénierie question qui exige des faits.
S. Lott : je voudrais essayer de la base de données de mise en œuvre. Il serait pour une bonne comparaison. J'ai encore beaucoup de temps pour le compléter. Le problème que j'ai maintenant est le stockage de l'index dans la base de données. Je pensais que le dictionnaire de la mise en œuvre était une bonne idée, mais qui ne sera pas possible dans une base de données. J'ai lu ces posts concernant le stockage de base de données stackoverflow.com/questions/1571140/... , stackoverflow.com/questions/3581792/... mais ils n'ont pas été d'une grande aide.
"dictionnaire de la mise en œuvre était une bonne idée, mais qui ne sera pas possible dans une base de données". Faux. Obtenir une meilleure ORM.

OriginalL'auteur easysid | 2010-10-18