我有一个代码可以按名称搜索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];
}
答案 0 :(得分:2)
我需要运行500万个名称,并且数据库有超过2亿人。
将500万条记录插入到临时表中,然后运行单个查询以获取结果集。让数据库想知道如何最好地解决这个问题。这是他们的工作,大多数人都很擅长。
只需将其与实际的人员名单进行比较即可。您想将此列表分给一个进行查找的人,然后让他不受干扰地进行处理,直到他完成为止。您不想想要做的是雇用另外 40个人,每隔几秒钟用一个名字敲开这个可怜的家伙的门,告诉他去查那个名字。现在。
答案 1 :(得分:0)
MongoDB进程占用的CPU或应用程序是否占用100%的资源?
如果是应用程序,则有一些提示:
不要为每个查询创建新的MongoDB客户端。将它们保存在(线程本地)实例变量中。
影响网络的方法(例如searchPerson
方法)最好异步实现。
```
公共异步任务searchPerson(字符串名称)
{
// ...
List<Person> peopleList = await Task.Run(() => myCollection.AsQueryable<Person>().Where(e => e.Name == name).ToList<Person>());
// ...
} ```
(也许您可以跳过Task.Run并使用异步版本的MongoDB客户端)。