2011-02-18 121 views
0

我在win64機器上測試MongoDB 1.6.5速度和C#。我使用Yahoo.geoplanet作爲來源加載州,縣,城鎮,但我不是非常高性能。目前我有5秒多的時間從這些源代碼中加載美國各州,將列表傳遞給本地主機的網頁。 只使用id作爲索引。有人可以建議的方式來執行。由於MongoDB C#低性能問題

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(); 
    } 
} 
+0

通過查詢返回多少'BsonPlaces'? – 2011-02-18 23:19:06

回答

2

我想不是在MongoDB中的問題,裝載的原因有兩個很慢:

  1. 您試圖加載「BsonPlaces」(20000例如甚至更多)的大數目。
  2. 頁面上的一些其他代碼需要很長時間。

對於速度的提高,您可以:

1.設置限制的項目,將被查詢將返回:

cursor.SetLimit(100); 

的 '名稱' 2.創建索引, 'ISO' ,'Place_Type':

helper.GeoPlanet.PlacesRepository.Db.Places.EnsureIndex("Name"); 
1

我從Yahoo下載了GeoPlanet數據,發現geoplanet_places_7.6.0.tsv文件有5,653,969行數據。

這意味着在沒有索引的情況下,您將對超過500萬個條目進行「全表掃描」以檢索50個美國州。

當一個國家或地區內狀態查詢,下列指標很可能是最有幫助的:

... EnsureIndex( 「ISO」, 「Place_Type」);

不知道你爲什麼要搜索所有「國家」而沒有指定國家,但你需要另一個索引。

有時候,當涉及排序時,索引匹配排序順序可能是有利的。例如,由於您正在對「名稱」進行排序,因此索引可能爲:

... EnsureIndex(「Iso」,「Place_Type」,「Name」);

但是,只有50個州,排序可能會非常快。

我懷疑你的慢速性能是否歸因於C#驅動程序,但是如果在添加索引後仍然有性能問題,請告訴我們。

+0

謝謝羅伯特的時間現在在〜230ms。 – user325558 2011-02-19 12:01:25

2

c#驅動程序可能有很大的性能問題。在shell上執行100k次的簡單查詢需要3秒鐘,同樣的查詢(用官方C#驅動程序1.5的c#linq編寫)需要30秒。 Profiler告訴來自c#客戶端的每個查詢少於1毫秒。所以我假設c#驅動程序正在做很多不必要的事情,使查詢如此緩慢。

在mongodb 2.0.7下,操作系統:windows 7,ram:16G。

+0

你有沒有找到這個問題的原因/解決方案?我似乎有同樣的問題。 – 2014-10-06 09:11:48