その4。大量インサートとかインデックス。↓ソース
//ためし用のクラス public class TestDoc { public ObjectId Id { get; set; } public int 連番 { get; set; } public string ボディ { get; set; } }
//1000万件オブジェクト作って、普通にInsertMany Listdocuments = new List (); for (int i = 0; i < 10000000; i++) { documents.Add( new TestDoc { 連番 = i, ボディ ="あいうえおかきくけこ" } ); } collection.InsertMany(documents);//2m57s789
//1000万件オブジェクト作って、BulkInsert var models = new List>(); for (int i = 0; i < 10000000; i++) { models.Add( new InsertOneModel (new TestDoc { 連番 = i, ボディ = "あいうえおかきくけこ" }) ); } collection = database.GetCollection ("TestDocBulk"); collection.BulkWrite(models);//2s41m349
//1000万件を10万件毎にBulkInsert var models = new List>(); for (int i = 0; i < 10000000; i++) { models.Add( new InsertOneModel (new TestDoc { 連番 = i, ボディ = "あいうえおかきくけこ" }) ); if(i % 100000 == 0 && i != 0) { collection.BulkWrite(models); models.Clear(); } } //2m37s157
InsertManyとBulkWriteに大差がないとゆー。Bulkは何かで使えるのだろーか。 もうちょっと複雑なドキュメントとかだと意味あるのかしら。。。 ある程度のまとまりに分けてインサートすると、メモリがアホみたいに増えないので、時間的な差があまりなさそーだし、やっぱこっちのほうがいいかな。次はFind。Bulkで作ったコレクションで試す(1000万レコード)。
//インデックスなし var finddocument = collection.Find(new BsonDocument { { "連番", 12345 } }); long count = finddocument.Count();// ⇒ 4s045 ListlistTmp = finddocument.ToList();// ⇒ 3s686 //インデックスつける collection.Indexes.CreateOne(new BsonDocument("連番", 1)); //同じのもう一回 var finddocument = collection.Find(new BsonDocument { { "連番", 12345 } }); long count = finddocument.Count();// ⇒ 0s088 List listTmp = finddocument.ToList();// ⇒ 0s013
インデックス無いとやっぱ使いものにならないす。インデックスつけてよーやくいい感じ。
なんとなくつかめてきたので、後は実地でいろいろ試してみよう。