2013-02-17 5 views
0

J'ai ajouté une fonction GeoNear avec MongoDB C# comme ça:MongoDB C# GeoNEar est lent

` var options = GeoNearOptions.SetMaxDistance(rangeInKm/earthRadius /* to radians */) 
                .SetSpherical(true).SetDistanceMultiplier(6378.137); 
        collection.EnsureIndex(IndexKeys.GeoSpatial("PlacePoint"));' 


MongoDB.Driver.GeoNearResult<MongoPlace> Georesults = collection.GeoNear(Query.Null, coordinates[0], coordinates[1], TakeNum,options); 

J'ai plus de 3000 places dans les données ... il prend trop de temps. comment je peux l'améliorer

+0

Vous avez vraiment besoin de fournir plus de détails sur "trop ​​long"; Que mesurez-vous réellement, quelles sont les spécifications de votre serveur? Je suggèrerais également de passer en revue [mongostat] (http://docs.mongodb.org/manual/reference/mongostat/) la sortie collectée pendant que votre requête est en cours d'exécution sur le serveur. – Stennie

Répondre

0

Il serait utile de savoir combien de temps "trop ​​long" est, car cela pourrait être très relatif. Cela pourrait aussi aider à savoir quelle version vous utilisez, ainsi que le type de matériel que vous utilisez.

Mais étant donné que les informations que vous avez ci-dessus, un ralentissement potentiel est votre

collection.EnsureIndex(IndexKeys.GeoSpatial("PlacePoint")); 

Il semble que vous pourriez être en cours d'exécution, avant chaque requête, ce qui serait un non-non, puisque vous ne devez créer un index sur votre collection une fois, et je suppose que cela pourrait vous ralentir.

Vous pouvez essayer de lancer votre commande à partir du shell mongo, comme si (en remplaçant vos valeurs réelles pour mes espaces réservés, bien sûr):

db.runCommand({ geoNear: "<collectionName>", near: [<lon>,<lat>], num: <num>, spherical:true }) 

Ensuite, regardez les informations « stats » pour voir s'il y a quelque chose là qui semble mal. Personnellement, j'ai une collection avec 234107 emplacements avec un index géospatial sur eux, et j'ai exécuté une commande geoNear avec des coordonnées qui étaient intentionnellement loin de tous les endroits dans ma collection pour aider à assurer qu'il analyserait chacun d'eux. J'ai obtenu les résultats suivants (exécution de la version 2.2.3 sur un matériel modestement puissant: Core i5, 16 Go de RAM, 7200 RPM HDD - ensemble de données se composait de documents assez petits comprenant les points lat/lon + une petite quantité de données supplémentaires):

"stats" : { 
      "time" : 261, 
      "btreelocs" : 0, 
      "nscanned" : 234107, 
      "objectsLoaded" : 133, 
      "avgDistance" : 1.380670166668938, 
      "maxDistance" : 1.3807179692447809 
    }, 

sur une requête qui était plus proche de lieux dans ma collection, je me suis:

"stats" : { 
      "time" : 15, 
      "btreelocs" : 0, 
      "nscanned" : 6211, 
      "objectsLoaded" : 29, 
      "avgDistance" : 0.003811909711576418, 
      "maxDistance" : 0.003919781450489085 
    }, 

Le « temps » est ici en millisecondes, ce qui me semble très raisonnable. L'exécution de la fonction GeoNear en C# est toujours revenue presque instantanément pour moi, donc je ne pense pas que vos résultats lents seraient dus à une quelconque inefficacité du pilote C#.

+2

La commande [ensureIndex] (http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/#db.collection.ensureIndex) est effectivement un no-op si elle est appelée plusieurs fois avec la même spécification et ne devrait pas être un ralentissement significatif (bien qu'il soit certainement inutile d'appeler à plusieurs reprises). – Stennie