2013-02-17 3 views
0

Я добавил функцию GeoNear с MongoDB C# так:MongoDB C# GeoNEar медленно

` 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); 

У меня есть более 3000 мест в данных ... это занимает слишком много времени. Как я могу сделать это лучше

+0

Вам действительно нужно предоставить более подробную информацию о «слишком длинном»; что вы на самом деле измеряете, каковы ваши характеристики сервера? Я также хотел бы рассмотреть вывод ['mongostat'] (http://docs.mongodb.org/manual/reference/mongostat/), собранный во время выполнения вашего запроса на сервере. – Stennie

ответ

0

Было бы полезно знать, как долго «слишком длинный», поскольку это может быть очень относительным. Это также может помочь узнать, какую версию вы используете, а также какое оборудование вы используете.

Но, учитывая только ту информацию, которая у вас есть выше, один потенциальное замедление вашего

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

Похоже, что вы могли бы работать, что перед каждым запросом, который не был бы-нет, так как вы должны только создайте индекс в своей коллекции один раз, и я бы предположил, что это может замедлить вас.

Вы могли бы попробовать запустить команду из Монго оболочки, как и (подставляя свои реальные значения для моих заполнителей, конечно):

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

Тогда посмотрите на информацию «Статистика», чтобы увидеть, если есть что-то там это кажется неправдой. У меня лично есть коллекция с 234107 местами с геопространственным индексом на них, и я запустил команду geoNear с координатами, которые были намеренно удалены от любого из мест в моей коллекции, чтобы гарантировать, что он будет сканировать каждый из них. Я получил следующие результаты (работающая версия 2.2.3 на скромно мощном оборудовании: Core i5, 16 ГБ RAM, 7200 RPM HDD - набор данных состоял из довольно небольших документов, состоящих из точек lat/lon + небольшого количества дополнительных данных):

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

на запрос, который был ближе к местам в моей коллекции, я получил:

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

«время» здесь находится в миллисекундах, который кажется очень разумным мне. Запуск функции GeoNear в C# всегда возвращался сразу для меня, поэтому я не думаю, что ваши медленные результаты будут вызваны любой неэффективностью драйвера C#.

+2

Команда [secureIndex] (http://docs.mongodb.org/manual/reference/method/db.collection.ensureIndex/#db.collection.ensureIndex) фактически является no-op, если вызывается несколько раз с той же спецификацией и не должно быть значительным замедлением (хотя определенно не нужно многократно звонить). – Stennie

Смежные вопросы