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

Raz*_*kar 1 c# mongodb

我有几个对象列表

List<ObjectClass1> ObjectList1;
List<ObjectClass2> ObjectList2;
Run Code Online (Sandbox Code Playgroud)

我想在测试运行结束时将所有对象作为 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);          
}
Run Code Online (Sandbox Code Playgroud)

dni*_*ess 5

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

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);
Run Code Online (Sandbox Code Playgroud)

...第二个对象列表或多或少相同。这将简单地以批量加载方式运行插入,即避免调用 MongoDB 数千次的开销,而是将对象列表分成 1000 个文档的包并将它们发送到 MongoDB。

如果这还不够快,根据您的设置,有多种可能有意义的事情:

  • 简介发生了什么事!只要您不知道瓶颈是什么,优化就没有意义。
  • 序列化过程(将实体转换为 BsonDocuments)在所需的 CPU 功率方面相当大,因此您需要并行执行该操作(使用多个线程) - 您需要一个具有大量内核的 CPU。
  • 然后,您需要使用InsertMany 上述方法的异步实现,以便您的 CPU 在将大量文档发送到 MongoDB 后,在等待网络/IO 部分时可以继续工作。
  • 如果您追求原始性能,您应该尝试使文档尽可能小 - 永远不要低估这方面的影响!
  • 您可以投资更强大的硬件。这总是一个选择...
  • 您可以围绕 MongoDB 设置执行各种操作,包括在 I/O 部分是罪魁祸首的情况下将负载分配到各个系统的分片。
  • 您可以尝试写关注级别
  • 你可以摆弄MongoDB 存储引擎
  • ...可能还有更多危险的东西。;)