#c #mongodb-query #aggregate #mongo-cxx-driver
#c #mongodb-запрос #агрегировать #mongo-cxx-driver
Вопрос:
У меня есть код opencv, и он должен выполняться очень быстро, быстрее, чем все циклы в opencv. Вот почему я добавил большинство процессов в базу данных, но когда все происходит очень быстро, доступ к представлению из курсора происходит медленно, согласно кодам opencv.
Я хочу быстрее получить доступ к представлению из курсора. Есть ли какой-либо другой способ обойти это? Например, могу ли я написать функцию или что-то еще, чтобы mongocxx возвращал мне прямое представление?
Я выполнил следующие операции. Я разделяю операции с их истекшим временем. Я был бы очень рад, если вы сможете помочь.
void MongoDB::SecondPointIteration(cv::KeyPointamp;keypoints, SecondIterParamsamp; secondIterParams ){
auto start1 = std::chrono::steady_clock::now();
secondParams = secondIterParams;
mongocxx::pipeline secondIterPipeline = setSorgu();
mongocxx::cursor cursor = features.aggregate(secondIterPipeline, mongocxx::options::aggregate{});
auto end1 = std::chrono::steady_clock::now();
auto time = std::chrono::duration_cast<std::chrono::microseconds>(end1-start1).count();
std::cout<<"2.1: t"<< time<<"ms"<<std::endl;
auto start3 = std::chrono::steady_clock::now();
for(autoamp;amp; doc : cursor) {
auto end3 = std::chrono::steady_clock::now();
auto time3 = std::chrono::duration_cast<std::chrono::microseconds>(end3-start3).count();
std::cout<<"2.2.1: t"<< time3<<"ms"<<std::endl;
auto start2 = std::chrono::steady_clock::now();
...
keypoints.response = doc["_id"]["response"].get_double().value;
auto end2 = std::chrono::steady_clock::now();
auto time2 = std::chrono::duration_cast<std::chrono::microseconds>(end2-start2).count();
std::cout<<"2.2.2: t"<< time2<<"ms"<<std::endl;
}
auto end3 = std::chrono::steady_clock::now();
auto time3 = std::chrono::duration_cast<std::chrono::microseconds>(end3-start3).count();
std::cout<<"2.2: t"<< time3<<"ms"<<std::endl;
}
mongocxx::pipeline MongoDB::setSorgu(){
using namespace bsoncxx::builder::basic;
mongocxx::pipeline secondIterPipeline{};
...
secondIterPipeline.sort(make_document(kvp("_id.response", -1)));
secondIterPipeline.limit(1);
return secondIterPipeline;
}
Прошедшие времена записываются путем сопоставления std :: cout
1: 761ms
2.1: 80ms
2.2.1: 1150ms
2.2.2: 2ms
2.2: 1158ms
Число 1 представляет время, затрачиваемое циклами opencv
Моя база данных содержит похожие данные, такие как
[{
"keypoint": {
"response": 0
}
},{
"keypoint": {
"response": 0.0010120292427018285
}
},{
"keypoint": {
"response": 0.0017831606091931462
}
}]
Комментарии:
1. Вы используете встроенную модель данных или нормализованную? » Объедините объекты в один документ, если вы будете использовать их вместе. В противном случае разделите их (но убедитесь, что в объединениях не должно быть необходимости). » и » Выполняйте объединения во время записи, а не при чтении » и т.д. Из MongoDB — Моделирование данных
2. @TedLyngmo Привет, я обновляю вопрос, надеюсь, это ответ на то, что вы спросили.