0

我正在 win64 机器上测试 MongoDB 1.6.5 速度和 C#。我使用Yahoo.geoplanet作为来源来加载州、县、城镇,但我的表现不是很好。我目前有更多 5 秒的时间从这些源加载美国各州,将列表传递到 localhost 中的网页。仅使用 id 作为索引。有人可以建议执行方式。谢谢

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

3 回答 3

2

c#驱动程序可能有很大的性能问题。在 shell 上进行 100k 次的简单查询需要 3 秒,相同的查询(用官方 c# 驱动程序 1.5 的 c# linq 编写)需要 30 秒。Profiler 告诉来自 c# 客户端的每个查询不到 1 毫秒。所以我假设 c# 驱动程序正在做很多不必要的事情,这使得查询变得如此缓慢。

mongodb 2.0.7下,操作系统:windows 7,内存:16G。

于 2012-08-12T12:16:23.373 回答
2

我想问题不在 mongodb 中,加载速度可能很慢,原因有两个:

  1. 您试图加载大量的“BsonPlaces”(例如 20000 甚至更多)。
  2. 页面上的其他一些代码需要很长时间。

为了提高速度,您可以:

1.设置查询返回的项目限制:

 cursor.SetLimit(100); 

2.为“Name”、“Iso”、“Place_Type”创建索引:

helper.GeoPlanet.PlacesRepository.Db.Places.EnsureIndex("Name");
于 2011-02-18T23:31:19.987 回答
1

我从 Yahoo 下载了 GeoPlanet Data,发现 geoplanet_places_7.6.0.tsv 文件有 5,653,969 行数据。

这意味着在没有索引的情况下,您正在对超过 500 万个条目进行“全表扫描”以检索美国 50 个州。

在查询一个国家/地区的州时,以下索引可能最有帮助:

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

不知道为什么要在不指定国家/地区的情况下搜索所有“州”,但您需要另一个索引。

有时当涉及排序时,索引匹配排序顺序可能是有利的。例如,由于您正在对“名称”进行排序,因此索引可能是:

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

然而,只有 50 个州,无论如何排序可能会非常快。

我怀疑您的性能缓慢是否归因于 C# 驱动程序,但是如果在添加索引后您仍然遇到性能问题,请告诉我们。

于 2011-02-19T00:13:42.437 回答