Mongocxx Как я могу быстрее получить доступ к представлению из курсора

#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 Привет, я обновляю вопрос, надеюсь, это ответ на то, что вы спросили.