【问题标题】:Program not scaling up with MongoDB程序未使用 MongoDB 扩展
【发布时间】:2019-01-01 06:35:26
【问题描述】:

我有一个在 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];
}

【问题讨论】:

    标签: c# mongodb scalability


    【解决方案1】:

    我需要运行 500 万个名字,而我的数据库有超过 2 亿人。

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

    只需将其与纸上的实际人员名单进行比较即可。您想将这份清单一次性交给进行查找的人,并让他不受干扰地处理它,直到他完成为止。你不想想要做的是雇用另外 40 个人,每隔几秒用一个名字敲这个可怜的家伙的门,告诉他查找那个名字现在。

    【讨论】:

    • 我刚刚注意到它是 mongoDB 而不是传统数据库,所以我的措辞可能有点偏离。但一般来说,同样的哲学应该适用。 MongoDB JOIN
    【解决方案2】:

    MongoDB 进程是否达到 100% CPU 或您的应用程序?

    如果是应用程序,这里有几个提示:

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

    2. 访问网络的方法(如您的searchPerson 方法)最好异步实现。 ``` 公共异步任务搜索人(字符串名称) { // ...

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

      } ```

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

    【讨论】:

    • 这是来自 API 的代码,具有 40 个线程的程序正在使用该 API,这是一个测试我可以使用我的 API 发出多少并发请求。但是我已经发现了问题,首字母的结果太多了,所以我只是限制了结果。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2019-10-11
    相关资源
    最近更新 更多