MongoDB C#驱动程序性能下降

时间:2015-07-31 15:50:06

标签: c# mongodb

我正在测试MongoDB及其正在进行的项目的c#客户端。我做了一些基准测试,对于我的测试,c#项目创建了一个简单的应用程序,它实例化10.000.000对象并将它们插入到MongoDB集合中。每个文档大约有10个字段。这些字段随机分配的值非常短(2或3个字符)或整数。

几分钟后,它成功存储了所有10.000.000文档。现在我使用mongo shell和提供的rest服务来做一些简单的查询。我正在搜索特定的字符串(例如' AAA'或BBB'),它花费了大约200-300毫秒并返回了10.000个结果(设置了一些限制)。创建索引后,它只需要最多20ms,这是我想要的性能,因为它将是一个读取繁重的应用程序。

到目前为止非常开心。然后我尝试在c#client中创建相同的查询,它总是需要至少200ms才能执行。即使多次调用同一个查询。

我已经在两个不同的系统上进行了测试。 - 一款是Intel xeon e5 1660 v3,配备48GB内存和企业级SSD - 第二个是i7,8GB的RAM和入门级SSD

目前,我在两台PC上都获得了相同的结果。

我知道第一个查询/连接可能代价高昂并需要一些时间,但我已经将相同的查询运行了50次并且它总是返回相同的结果 - 200 - 250ms范围

在两台机器上进行了一些测试后,我决定从头开始。我创建了一个简单的项目(附上下面的代码)。并尝试基于我插入的1000个结果进行查询。我得到了同样慢的查询时间。一个简单的'返回所有结果'查询需要250 - 300毫秒。即使在分配限制而只获取一个项目时也是如此。

我的插入代码:

        _client = new MongoClient();
        _database = _client.GetDatabase("search");

        collection = _database.GetCollection<TestVote>("testVotes");

        for (int i = 0; i < 1000; i++)
        {
            TestVote vote = new TestVote();
            vote.postNumber = RandomString(2); // the id of the politician
            vote.randomSeed = _rng.Next(0, 5000);

            collection.InsertOneAsync(vote);
        } 

TestVote类:

class TestVote
{
    public ObjectId Id;
    public string postNumber;
    public int randomSeed;
}

我的查询代码:

        var watch = Stopwatch.StartNew();

        //var filter = Builders<TestVote>.Filter.Eq("postNumber", "AA"); 
        // ^ this only returns one results and still takes 300ms
        //var result = await collection.Find(filter).FirstOrDefaultAsync();

        var result = await collection.Find(_ => true).Limit(5).FirstOrDefaultAsync();

        watch.Stop();
        var elapsedMs = watch.ElapsedMilliseconds;

        Console.WriteLine(elapsedMs + " " + result.postNumber);

我已经尝试了查询代码的注释部分以及相同的结果

0 个答案:

没有答案