gpt4 book ai didi

javascript - Mongo 脚本在本地运行速度很快,但如果我针对远程实例运行它会很慢?

转载 作者:可可西里 更新时间:2023-11-01 09:44:18 25 4
gpt4 key购买 nike

我有一个 mongo 脚本,用于在数据库迁移后执行一些数据清理。

当我在本地运行此脚本时,它会在大约 5 分钟内完成。当我从我的本地机器针对远程实例运行脚本时,它需要永远(我通常在大约两个小时后将其终止)。这些数据库本质上是相同的。索引都是一样的,可能有几条记录在一个地方,而另一个地方没有。

我正在执行这样的脚本:

本地-

mongo localDatabase script.js

针对远程实例-

mongo removeServer/remoteDatabase -u user -p password script.js

我曾假设,由于我将脚本传递给远程实例,它将完全在远程机器上执行,而无需在远程机器和我的本地机器之间来回传输数据(因此会有性能差异不大)。

这个假设是否正确?知道为什么我看到本地/远程之间的巨大性能差异吗?有关如何修复的建议?

最佳答案

是的,您可以使用 Bulk operations ,MongoDB 中的所有操作都是围绕单个集合设计的,但是循环一个集合并插入或更新另一个集合并没有错。

事实上,在 MongoDB 2.6 shell 中,这是最好的方法,实际的收集方法本身尝试在幕后使用“批量”方法,即使它们实际上每次操作只执行单个更新/插入。这就是为什么您会在 shell 中看到不同的响应。

请注意,您的服务器也需要是 MongoDB 2.6 或更高版本的实例,这就是为什么 shell 中的收集方法会在您连接到较旧的服务器时进行一些检测的原因。

但基本上你的过程是:

    var bulk = db.targetcollection.initializeOrderedBulkOP();
var counter = 0;

db.sourcecollection.find().forEach(function(doc) {

bulk.find({ "_id": doc._id }).updateOne(
// update operations here
);
counter++;

if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.targetcollection.initializeOrderedBulkOP();
}

});

if ( counter % 1000 != 0 )
bulk.execute();

Bulk API 本身将使您发送给它的所有操作“排队”,直到调用将操作发送到服务器的执行。 API本身只会将任何操作保留在“队列”中,直到它被调用,但实际上一次只发送 1000 个条目的批处理。为了避免用完额外的内存,这里要格外小心地用模数手动限制它。

您可以根据需要调整该数量,但请记住,确实存在 16MB 的硬性限制,因为这基本上转化为 BSON 文档作为请求。

查看所有选项的完整手册页,包括更新插入、多重更新、插入和删除。甚至是无序操作,其中单个错误的顺序或失败并不重要。

另请注意,后一种情况下的写入结果将返回列表中的错误项(如果有)以及包含应用更新插入列表等内容的响应。

结合让您的 shell 实例尽可能靠近服务器,减少的“来回”流量将加快速度。正如我所说,无论如何 shell 都会使用这些,因此您不妨利用这些来发挥您的优势。

关于javascript - Mongo 脚本在本地运行速度很快,但如果我针对远程实例运行它会很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25189652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com