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

时间:2017-07-31 17:30:20

标签: c# mongodb

我有几个对象列表

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);          
}

2 个答案:

答案 0 :(得分:2)

您无需将其序列化为Json即可调用:

ObjectList1Collection.InsertManyAsync(ObjectList1);

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

答案 1 :(得分:2)

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

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);

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

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

  • 描述正在发生的事情!只要你不知道瓶颈是什么,优化就没什么意义了。
  • 序列化过程(将您的实体转换为BsonDocuments)非常重要 需要CPU功率,因此您可能希望并行执行该操作(使用多个 线程) - 你会想要一个拥有大量内核的CPU。
  • 然后你想要使用InsertMany的异步实现 上面提到的方法,所以你的CPU可以继续工作 发送一大块文件后等待网络/ IO部分 关闭MongoDB。
  • 如果你是在追求原始表现,你应该尽量保持你的文件尽可能小 - 永远不要低估这方面的影响!
  • 您可以投资更强大的硬件。这总是一个选择......
  • 你可以围绕MongoDB设置做各种事情,包括分片,以便在I / O部分成为罪魁祸首的情况下将负载分配给各种系统。
  • 您可以使用write concern levels
  • 你可以摆弄MongoDB storage engine
  • ......可能还有很多危险的东西。 ;)