MongoDB C # проблема низкой производительности - PullRequest
0 голосов
/ 19 февраля 2011

Я тестирую скорость MongoDB 1.6.5 и C # на машине win64.Я использую Yahoo.geoplanet в качестве источника для загрузки штатов, округов, городов, но я не очень эффективен.В настоящее время у меня есть больше 5 секунд, чтобы загрузить штаты США из этих источников, передав список на веб-страницу в localhost.Используйте только идентификатор в качестве индекса.Может кто-нибудь подсказать способ выполнения.Спасибо

class BsonPlaces  
{  
   [BsonId]  
   public String Id { get; set; }  
   public String Iso { get; set; }  
   public String Name { get; set; }  
   public String Language { get; set; }  
   public String Place_Type { get; set; }  
   public String Parent_Id { get; set; }    
}  

public List<BsonPlaces> Get_States(string UseCountry)
{
   using (var helper = BsonHelper.Create())
   {
     var query = Query.EQ("Place_Type", "State");
     if (!String.IsNullOrEmpty(UseCountry))
       query = Query.And(query, Query.EQ("Iso", UseCountry));
     var cursor = helper.GeoPlanet.PlacesRepository.Db.Places
                  .FindAs<BsonPlaces>(query);
     if (!String.IsNullOrEmpty(UseCountry))
         cursor.SetSortOrder(SortBy.Ascending("Name"));
     return cursor.ToList();
   }
}

Ответы [ 3 ]

2 голосов
/ 12 августа 2012
Драйвер

c #, вероятно, имеет большую проблему с производительностью. Простой запрос 100k раз для оболочки занимает 3 секунды, тот же запрос (написанный на c # linq официального драйвера c # 1.5) занимает 30 секунд. Профилировщик сообщает, что каждый запрос от клиента c # занимает менее 1 мс. Поэтому я предполагаю, что драйвер c # делает много ненужных вещей, которые делают запрос таким медленным.

Под mongodb 2.0.7, ОС: Windows 7, Ram: 16G.

2 голосов
/ 19 февраля 2011

Я полагаю, проблема не в mongodb, загрузка может быть медленной по двум причинам:

  1. Вы пытаетесь загрузить большое количество BsonPlaces (например, 20000 или даже больше).1005 * Некоторый другой код на странице занимает много времени.

Для повышения скорости вы можете:

1.Установить ограничение для элементов, которые будут возвращены запросом:

 cursor.SetLimit(100); 

2.Создать индексы для 'Name', 'Iso', 'Place_Type':

helper.GeoPlanet.PlacesRepository.Db.Places.EnsureIndex("Name");
1 голос
/ 19 февраля 2011

Я загрузил данные GeoPlanet из Yahoo и обнаружил, что в файле геопланет_places_7.6.0.tsv содержится 5 653 969 строк данных.

Это означает, что при отсутствии индекса вы выполняете «полное сканирование таблицы» более 5 миллионов записей, чтобы получить 50 штатов США.

При запросе штатов внутри страны, вероятно, наиболее полезным будет следующий индекс:

... EnsureIndex ("Iso", "Place_Type");

Не уверен, почему вы хотите искать все "Штаты" без указания страны, но для этого вам понадобится другой индекс.

Иногда, когда используется сортировка, может быть полезно, чтобы индекс соответствовал порядку сортировки. Например, поскольку вы сортируете по «Имени», индекс может быть:

... EnsureIndex ("Iso", "Place_Type", "Name");

Однако, только с 50 состояниями сортировка, вероятно, будет очень быстрой в любом случае.

Я сомневаюсь, что любая ваша низкая производительность связана с драйвером C #, но если после добавления индексов у вас все еще есть проблемы с производительностью, сообщите нам.

...