我需要创建一个脚本,该脚本将检查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客户端中?
答案 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操作,则在一段时间后会变慢)。