2017-07-31 117 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
  • 撥弄......,可能很多更危險的東西。 ;)