C# C.将对象列表保存到Mongo的最快方法

C# C.将对象列表保存到Mongo的最快方法,c#,mongodb,C#,Mongodb,我有几张物品清单 List<ObjectClass1> ObjectList1; List<ObjectClass2> ObjectList2; 我希望在测试运行结束时将所有对象作为JSON写入Mongo。 最快的方法是什么? 我目前正在这样做: IMongoClient client = new MongoClient(); IMongoDatabase db = client.GetDatabase("MyDB"); db.CreateCollection("Obj

我有几张物品清单

List<ObjectClass1> ObjectList1;
List<ObjectClass2> ObjectList2;
我希望在测试运行结束时将所有对象作为JSON写入Mongo。 最快的方法是什么? 我目前正在这样做:

IMongoClient client = new MongoClient();
IMongoDatabase db = client.GetDatabase("MyDB");
db.CreateCollection("ObjectList1");
var ObjectList1Collection = db.GetCollection<BsonDocument>("ObjectList1");
foreach(ObjectClass1 obj in ObjectList1)
{
   var document = BsonSerializer.Deserialize<BsonDocument>(MyJSONSerializer.Serialize(obj));
   ObjectList1Collection.InsertOneAsync(document);          
}

db.CreateCollection("ObjectList2");
var ObjectList1Collection = db.GetCollection<BsonDocument>("ObjectList2");
foreach(ObjectClass2 obj in ObjectList2)
{
   var document = BsonSerializer.Deserialize<BsonDocument>(MyJSONSerializer.Serialize(obj));
   ObjectList2Collection.InsertOneAsync(document);          
}

您不需要将其序列化为Json,只需调用:

ObjectList1Collection.InsertManyAsync(ObjectList1);

据我所知,这应该是最快的方式。

您不需要将其序列化为Json,只需调用:

ObjectList1Collection.InsertManyAsync(ObjectList1);

据我所知,这应该是最快的方法。

我建议您从以下代码开始:

IMongoClient client = new MongoClient();
IMongoDatabase db = client.GetDatabase("MyDB");
// create collection calls are not needed, MongoDB will do that for you
// db.CreateCollection("ObjectList1");
var objectList1Collection = db.GetCollection<ObjectClass1>("ObjectList1");
objectList1Collection.InsertMany(ObjectList1);
…对于第二个对象列表,大致相同。这将简单地以批量加载方式运行insert,即避免数千次调用MongoDB的开销,而是将对象列表分成包含1000个文档的包并发送给MongoDB

如果速度不够快,根据您的设置,可能会有各种各样的事情发生:

描述发生了什么事!只要你不知道瓶颈是什么,优化就没有什么意义。 实体到BsonDocuments的序列化过程转换在以下方面非常重要: 需要CPU功率,所以您可能希望使用多个CPU并行执行该位 线程-您可能需要一个具有大量内核的CPU。 然后您需要使用InsertMany的异步实现 方法,这样您的CPU可以在 发送一大块文档后等待网络/IO部件 去MongoDB。 如果您追求的是原始性能,那么您应该尽量使文档尽可能小-永远不要低估这方面的影响! 你可以投资更强大的硬件。这永远是一个选择。。。 您可以围绕MongoDB设置执行各种操作,包括分片,以便在I/O部分是罪魁祸首的情况下将负载分配到各个系统。 你可以和我一起玩 你可以摆弄一下桌子 …可能还有更危险的东西;
我建议您从以下代码开始:

IMongoClient client = new MongoClient();
IMongoDatabase db = client.GetDatabase("MyDB");
// create collection calls are not needed, MongoDB will do that for you
// db.CreateCollection("ObjectList1");
var objectList1Collection = db.GetCollection<ObjectClass1>("ObjectList1");
objectList1Collection.InsertMany(ObjectList1);
…对于第二个对象列表,大致相同。这将简单地以批量加载方式运行insert,即避免数千次调用MongoDB的开销,而是将对象列表分成包含1000个文档的包并发送给MongoDB

如果速度不够快,根据您的设置,可能会有各种各样的事情发生:

描述发生了什么事!只要你不知道瓶颈是什么,优化就没有什么意义。 实体到BsonDocuments的序列化过程转换在以下方面非常重要: 需要CPU功率,所以您可能希望使用多个CPU并行执行该位 线程-您可能需要一个具有大量内核的CPU。 然后您需要使用InsertMany的异步实现 方法,这样您的CPU可以在 发送一大块文档后等待网络/IO部件 去MongoDB。 如果您追求的是原始性能,那么您应该尽量使文档尽可能小-永远不要低估这方面的影响! 你可以投资更强大的硬件。这永远是一个选择。。。 您可以围绕MongoDB设置执行各种操作,包括分片,以便在I/O部分是罪魁祸首的情况下将负载分配到各个系统。 你可以和我一起玩 你可以摆弄一下桌子 …可能还有更危险的东西;