2012-08-01 4 views
0

J'ai une collection de vecteurs La taille de la collectionrequête MongoDB prend beaucoup de temps

print vectors.count() 

est

Quand j'itérer les champs

start = time.time() 
for v in vectors.find({},{'vector' : 1, '_id' : 0}): 
    pass 
print "total time:" , end-start 

Temps total: 5,05100011826

mais quand je cours avec expliquer() Je vois que la requête prend beaucoup moins de temps.

print vectors.find({},{'vector' : 1, '_id' : 0}).explain() 

{u'nYields ': 0, u'allPlans': [{u'cursor ': u'BasicCursor', u'indexBounds ': {}}], u'nChunkSkips' : 0, u 'millis': 23, un ': 102020, un' curseur ': u'BasicCursor', un 'index': {}, un 'objet numérisé': 102020, un 'clé' ': Faux , u'indexOnly ': Faux, u'nscanned': 102020}

Pourquoi une telle différence de temps énorme? Y a-t-il un moyen d'accélérer cela? J'ai chargé tous les vecteurs dans un champ de texte de base de données sql et la même requête était inférieure à une seconde. Merci

+0

Est-ce que time.time() est en ms .. alors la requête normale prend 5ms et 23ms avec le explain? – Stennie

Répondre

0

Vous souhaiterez peut-être jouer avec batch_size pour améliorer la vitesse et réduire le nombre de sauts de réseau lors de l'itération des résultats.

start = time.time() 
for v in vectors.find({},{'vector' : 1, '_id' : 0}).batch_size(1000): 
    pass 
print "total time:" , end-start 
+0

J'ai essayé cela et même lorsque je faisais une taille de lot supérieure à celle de mon jeu de disques, j'avais des performances horribles. –

+0

Est-il possible de charger la totalité de la base de données en mémoire? –

+0

Les données sont toutes dans la mémoire virtuelle, donc en touchant les fichiers, vous pouvez obtenir toutes les données dans RAM. Il se peut que ce soit le coût de la transmission des données et de leur itération. – Ross

1

Je pense que le second vous montre simplement la vitesse qu'il faut pour MongoDB pour exécuter réellement « trouver » alors que l'ancien implique également la récupération chaque enregistrement unique à la console, et de les traiter.

0

Vous pouvez fournir un index sur le champ que vous souhaitez interroger, dans votre cas, il est "vector" i.e.:

vectors.createIndex({"vector":1},{sparse:true}) 

vous pouvez vérifier le temps de requête.

Questions connexes