2017-07-31 50 views
0

最快的方式我有对象C#。保存对象的名单蒙戈

List<ObjectClass1> ObjectList1; 
List<ObjectClass2> ObjectList2; 

的若干名单,我想所有对象的JSON写蒙戈在试运行结束。 这样做的最快方法是什么? 我目前这样做:

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

回答

1

你不需要序列化到JSON,你可以只要致电:

ObjectList1Collection.InsertManyAsync(ObjectList1); 

这应该是因为据我所知TE最快的方式。

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的核心。
  • 然后你想使用这样你的CPU上述InsertMany 方法的异步执行可以继续,而其 工作等待网络/ IO发送的文件 一大块关到MongoDB的后一部分。
  • 如果您在原始表现之后,您应该尽量保持文档尽可能小 - 从不低估这方面的影响!
  • 您可以投资更强大的硬件。这总是一个选项......
  • 你可以在MongoDB设置上做各种各样的事情,包括将分散负载分布到各种系统(如果I/O部分是罪魁祸首)。
  • 可以玩弄write concern levels
  • 您可以用MongoDB storage engine
  • 拨弄......,可能很多更危险的东西。 ;)