2011-02-18 122 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