Низкая производительность вставки MongoDB с драйвером C ++

Вот фрагмент кода, который я потратил последние 2 дня на оптимизацию и профилирование, потому что он занимал слишком много времени:

{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(TokensDB, tokensArray );
_dbConnection.done();
}

{
mongo::ScopedDbConnection _dbConnection (DbHost);
_dbConnection->insert(IdxDB, postingsArray);
_dbConnection.done();
}

Вот postingsArray является std::vector<BSON (int64_t, int64_t, int64_t, int)>, 20 000 элементов. Эта вставка всегда занимает всего пару миллисекунд. tokensArray является std::vector<BSON (int64_t, std::string)>, 5000 элементов. Это странная вставка.

Если я делаю это точно так же, как в фрагменте кода выше, это займет 45-50 мс. Но если я переключу два блока вокруг, как это было изначально (вставьте в IdxDB первый и TokensDB второе) это занимает 400-500 мс. Что здесь происходит? Почему порядок имеет значение? Почему вставка 5000 записей с 2 ​​полями занимает намного больше времени, чем вставка объектов с 20 полями из 4 полей?

Моя первоначальная идея заключается в том, что это из-за std::string поле (содержит одно английское слово, так что в среднем около 5-7 символов). Я заменил его случайным int64_t число — нет заметных изменений во времени завершения вставки.

Все профилирование выполняется на чистой базе данных и каждый раз с одинаковыми данными, я не верю, что это моя ошибка в организации измерений.

2

Решение

MongoDB выполняет много вещей в фоновом режиме, поэтому нормально, что вставка большого postingsArray занимает мало времени, но влияет на производительность после этого. Когда вы измеряете postingsArray вставка в одиночку — вы только измеряете время, необходимое для того, чтобы драйвер MongoDB принял вставку. Но когда вы измеряете последующие операции, вы начинаете замечать фоновую нагрузку, начатую postingsArray вставить.
Смотрите пункт 6 там: http://article.gmane.org/gmane.comp.db.mongodb.user/818

Кстати, как написано в вашем примере, я подозреваю, что MongoDB дает вам такое же соединение для вставок. (Например, вы можете подключиться к пулу, вставив postingsArray с этим, освобождая это, затем беря то же самое соединение от пула снова и вставляя tokensArray с этим). В этом случае сокет TCP / IP все еще может быть занят postingsArray вставить и то, что вы видите, может достигать предела для буфера TCP / IP.

Постскриптум Возможно, вы захотите изменить запись записи, чтобы измерить фактическое время, необходимое MongoDB для выполнения вставки: http://article.gmane.org/gmane.comp.db.mongodb.user/68288

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector