c++ - 使用 C++ 驱动程序时 MongoDB 插入性能较低

标签 c++ mongodb bulkinsert

这是我过去 2 天优化和分析的一段代码,因为它花费了太多时间:

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

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

这里postingsArraystd::vector<BSON (int64_t, int64_t, int64_t, int)> , 20 000 个元素。这个插入总是只需要几毫秒。 tokensArraystd::vector<BSON (int64_t, std::string)> ,5000 个元素。这是奇怪的插入。

如果我完全按照上面的代码片段进行操作,则需要 45-50 毫秒。但是,如果我像最初那样切换两个 block (插入到 IdxDB 第一个和 TokensDB 第二个),则需要 400-500 毫秒。这里发生了什么?为什么顺序很重要?为什么插入 5000 条 2 字段记录比插入 20k 4 字段对象花费的时间要长得多?

我最初的想法是因为 std::string字段(它包含单个英文单词,因此平均大约有 5-7 个符号)。我已将其替换为随机 int64_t number - 插入完成时间没有明显变化。

所有分析都是在干净的数据库上完成的,并且每次都使用完全相同的数据,我不认为这是我在组织测量时的错误。

最佳答案

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

关于c++ - 使用 C++ 驱动程序时 MongoDB 插入性能较低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14676339/

相关文章:

mysql - 批量插入SQL语句

c++ - 类名后的分号有什么作用?

c++ - 可变参数模板的罕见错误?

c# - 哪种方式更好?将媒体文件作为字节数组还是字符串保存到 MongoDB?

mongodb - 与 MongoLab 相比,在 VPS 上本地运行 MongoDB 是否有主要缺点?

sql-server-2000 - 更改 100GB 表的有效方法

c++ - 派生类中需要构造函数参数的成员对象如何初始化?

c++ - char* 到 std::string

python - mongodb支持redis中的spop之类的action吗?

mysql - 将数据从一个mysql表复制到同一数据库的另一个mysql表