使用C#将许多文档插入Mongodb的最快方法

时间:2019-01-20 01:55:08

标签: c# mongodb

我需要创建一个脚本,该脚本将检查C#列表,然后创建并插入大约320,000个mongodb文档。当前,我正在使用foreach循环创建代表mongo文档的C#类,将该文档添加到批处理中,并且当批处理大小达到99999时,我将该批处理插入数据库中。尽管使用了批处理插入,但我的脚本仍需要大约4个小时才能完成,这太慢了。

            foreach (var r in result)
            {
                var newdoc = new UserMailingList
                {
                    UserId = new Guid(r.rcid),
                    MailingListId = listid,
                    StatusId = 0,
                    IsDeleted = false,
                    Timestamp = DateTime.UtcNow
                };
                batch.Add(newdoc);
                batchsize++;
                if (batchsize == 99999)
                {
                    collection.insertmany(batch)
                    batchsize = 0;
                    batch.Clear();
                }
            }

是否有使用C#mongo客户端执行此操作的更快方法,还是可以生成代表我的批处理插入内容的javascript代码,以便可以将其直接粘贴到mongo客户端中?

1 个答案:

答案 0 :(得分:0)

我建议使您的批处理插入效果并行化。 MongoDB在一个以上的客户端连接中表现良好。并行化时,还使用c#驱动程序异步api(“ InsertManyAsync” a.s.o。)。

顺便说一句,MongoDB按1000个文档进行批处理,即使您的文档数大于该数量也是如此。

谈论“这些数据库操作花费的时间太长”时要考虑的其他要点是数据库(服务器)度量。是您的数据库负载很重吗,您的硬盘是否足够快以至于可以这么快地处理磁盘io。

还有更多需要考虑的事情 Bulk insert performance in MongoDB for large collections

PS:320000个文档似乎并不多。我们的mongo服务器每2秒不断编写3000 .. 10000个文档。请注意,没有特殊硬件(6xvCPU a2,2GHz,10GB RAM,带有SSD和旧式HDD混合的SAN)。如果您重新启动mongod进程,并且此后立即执行脚本,则速度会显着加快,那么我认为您的服务器承受着压力(mongodb如果无法处理/遵循DML操作,则在一段时间后会变慢)。