【问题标题】:Bulk inserting to MongoDB on Replicaset在 Replicaset 上批量插入 MongoDB
【发布时间】:2014-05-07 15:10:28
【问题描述】:

我正在将数据从 SQL 导入到 MongoDB

我在 SQL 中有一个包含 3081583 条记录的表,我开始在 foreach 循环中将这些记录插入 MongoDB

它在 05-06-2014 07:42:27 3081583 记录开始插入,并且仍在运行。

我使用 C# 驱动程序连接到 MongoDB

private static MongoDatabase ConnectionOne(string dbName = "test")
{
    var connectionString = "mongodb://username$passwordx.x.x.x:27018"
        + "/admin?slaveOk=true";

    var client = new MongoClient(connectionString);

    var server = client.GetServer();

    var database = server.GetDatabase(dbName);

    return database;
}

我可以做些什么来提高插入性能吗?这是批量插入 3081583 条或更多记录的正确方法吗?

我担心性能,因为这是一个每周的过程。

【问题讨论】:

    标签: c# .net mongodb bulkinsert mongodb-.net-driver


    【解决方案1】:
    1. 您可以通过将对象数组传递给插入命令来使用批量插入。您需要配置 ContinueOnError 并定义错误处理策略。但是你应该将整个集合拆分成块,以便单个卡盘不超过 16Mb。

    2. 通常,为了提高插入性能,您可以尝试限制集合中的索引数量,使用未确认的写入关注 {w:0, j:0} -(在这种情况下,您将无法确认插入是否成功)。

    【讨论】:

    • 如何在我的连接字符串中定义 {w:0, j:0}?
    • mongodb://username$passwordx.x.x.x:27018/admin?slaveOk=true&w=0&journal=false
    • WriteConcern(journal=False,w=0) 中有冲突的值。当 W=0 时,不能设置其他值。
    • 最后,mongodb://username$passwordx.x.x.x:27018/admin?slaveOk=true&w=0
    【解决方案2】:

    是的。可以批量插入:Bulk Inserts in MongoDB

    IEnumerable<WriteConcernResult> results = collection.InsertBatch(records)
    

    这将减少到数据库的大部分往返行程,这应该会加快速度。

    【讨论】:

    • 我的connectiontrig好吗。我是否必须指定任何写 conserns 以加快进程?
    • @HaBo 你可以关闭日志和索引,但这有它自己的问题。我不会定期这样做。
    • @I3arnon 这取决于数据性质。如果它像日志,那么为了提高性能,可能会默默地丢失一些数据可能是合适的。一些混合策略也可能是合适的,例如,每 100 个插入得到确认。如果发生非常糟糕的事情,它有助于检测错误。
    • 非常好,使用 insertBatch 插入速度非常快
    猜你喜欢
    • 2013-11-07
    • 2013-07-12
    • 2017-10-05
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    相关资源
    最近更新 更多