MongoDB C # проблема производительности курсора - PullRequest
2 голосов
/ 13 марта 2012

Я установил самую последнюю 64-битную БД MongoDB и официальный драйвер C # по состоянию на 13 марта 2012 года. Я получаю некоторые неожиданные результаты производительности с курсорами.

Следующий код будет извлекать и перебирать 500 000 записей со скоростью около 26,8к / с на моем ноутбуке Core 2 Duo 2 ГГц:

    var query = Query.EQ("_H._t", "Car");
    var cursor = mc.FindAs<RoctObj>(query);
    double priceTot = 0d;

    foreach (RoctObj item in cursor)
    {
        Car car = (Car)item._H;
        priceTot += car.Price;
    }

Это кажется разумным.Затем я настроил запрос так, чтобы возвращались только 721 результат.Выполнение кода занимает более 1,1 секунды, чем при замене сегмента foreach на:

    long i = cursor.Count();

Учитывая скорость первого примера, 721 запись должна занимать доли секунды для итерации.Я знаю, что есть и другие накладные расходы, но они должны быть такими плохими.Я не понимаю, почему я получаю +1,1 секунды.

Есть идеи?

РЕДАКТИРОВАТЬ

Вот альтернативный запрос.Обратите внимание, что время запроса не является вопросом.Это время итерации.

    var query = Query.And(
        Query.LTE("_H.Price", BsonDouble.Create(80000d)).GTE(BsonDouble.Create(40000d)),
        Query.LTE("_H.Cylinders", BsonDouble.Create(8d)).GTE(BsonDouble.Create(4d)),
        Query.LTE("_H.Capacity", BsonDouble.Create(3000d)).GTE(BsonDouble.Create(2000d)),
        Query.LTE("_H.TopSpeed", BsonDouble.Create(200d)).GTE(BsonDouble.Create(100d))
        );

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Вызов курсора. Count () не передает данные с сервера в ваше приложение. Он отправляет команду на сервер, и на сервере выполняется подсчет, и с сервера возвращается только крошечный пакет, содержащий числовой результат подсчета.

Не уверен, почему перебор документов занимает намного больше времени, чем простой подсчет. Одной из причин может быть то, что сервер может вычислить счетчик, используя только индекс, но когда вы на самом деле перебираете документы, серверу придется извлекать каждый отдельный документ с диска, если он еще не был выгружен в память.

Маловероятно, что в коде десериализации драйвера C # возникнет какое-либо узкое место, поскольку это довольно быстро.

Если вы можете предоставить пример программы, демонстрирующей наблюдаемое поведение, я был бы рад попытаться воспроизвести ваши результаты.

1 голос
/ 14 марта 2012

MongoDB не возвращает все результаты сразу, он возвращает курсор, который считывает данные из базы данных по одной записи за раз, так как ваше приложение запрашивает их (т.е. во время ваших итераций), что может быть причиной того, почему он медленнее.

Выполнение count() просто возвращает количество найденных совпадений, но без данных.

...