程序未使用MongoDB扩展

时间:2018-07-24 15:06:00

标签: c# mongodb scalability

我有一个代码可以按名称搜索MongoDB中的人员。我的代码的问题在于它没有按比例扩展,我尝试使用40个线程来运行此代码,但是当我在数据库中弄清响应时,我不得不关闭它,因为它占用了100%的CPU。正在搜索的所有三个字段都在MongoDB中建立了索引。有没有办法改善查询?我需要运行500万个名称,我的数据库有超过2亿人。

public Person searchPerson(string name)
{
    string MongoUser = "MONGO_USERNAME";
    string MongoPass = "MONGO_PASSWORD";
    string MongoURL  = "MONGO_URL";
    string MongoDB   = "MONGO_DB"; 

    MongoClient _client = new MongoClient("mongodb://" + MongoUser + ":" + MongoPass + "@" + MongoURL);

    IMongoCollection<BazingaPerson> myCollection   = _client.GetDatabase (MongoDB).GetCollection<Person>         ("COLLECTION_NAME");

    List<Person> peopleList = myCollection.AsQueryable<Person>().Where(e => e.Name == name).ToList<Person>();

    // both functions below only transform string like replace, substring or splits . They dont query in a DB or make web requests
    string nameInitials = getInitials(name); 
    string phoneticName = getPhoneticName(name);

    if(peopleList.Count() == 0) peopleList = myCollection.AsQueryable<Person>().Where(e => e.StandardName.Equals (phoneticName)).ToList<Person>();
    if(peopleList.Count() == 0) peopleList = myCollection.AsQueryable<Person>().Where(e => e.Initials.Equals (nameInitials)).ToList<Person>();

    if(peopleList.Count() == 0) return null;

    return peopleList[0];
}

2 个答案:

答案 0 :(得分:2)

  

我需要运行500万个名称,并且数据库有超过2亿人。

将500万条记录插入到临时表中,然后运行单个查询以获取结果集。让数据库想知道如何最好地解决这个问题。这是他们的工作,大多数人都很擅长。

只需将其与实际的人员名单进行比较即可。您想将此列表分给一个进行查找的人,然后让他不受干扰地进行处理,直到他完成为止。您不想想要做的是雇用另外 40个人,每隔几秒钟用一个名字敲开这个可怜的家伙的门,告诉他去查那个名字。现在。

答案 1 :(得分:0)

MongoDB进程占用的CPU或应用程序是否占用100%的资源?

如果是应用程序,则有一些提示:

  1. 不要为每个查询创建新的MongoDB客户端。将它们保存在(线程本地)实例变量中。

  2. 影响网络的方法(例如searchPerson方法)最好异步实现。 ``` 公共异步任务searchPerson(字符串名称) {     // ...

    List<Person> peopleList = await Task.Run(() => myCollection.AsQueryable<Person>().Where(e => e.Name == name).ToList<Person>());
    
    // ...
    

    } ```

(也许您可以跳过Task.Run并使用异步版本的MongoDB客户端)。