MongoDB Atlas очень медленно, чтобы вставить много - PullRequest
0 голосов
/ 24 января 2019

Я тестирую атлас MongoDB и по сравнению с тем, как мой код работает в Docker в локальной сети, что-то не так.

Вот журнал моего времени вставки докера;

Called Add for INInvoiceData
Adding 511 for INInvoiceData
Added
Time elapsed: 00:00:02
Finished add/update for INInvoiceData
Called Add for OEOrderData
Adding 427 for OEOrderData
Added
Time elapsed: 00:00:01
Finished add/update for OEOrderData
Total Time elapsed: 00:01:12

Здесь используется платный кластер 2 ГБ

Logged in
Called Add for INInvoiceData
Adding 511 for INInvoiceData
Added
Time elapsed: 00:00:59
Finished add/update for INInvoiceData
Called Add for OEOrderData
Adding 427 for OEOrderData
Added
Time elapsed: 00:00:48
Finished add/update for OEOrderData
Time elapsed: 00:03:00

Я в Новой Зеландии, а база данных находится в Орегоне (AWS) в США. Я использую InsertMany (), чтобы добавить около 500 документов.

Документы в среднем составляют около 11 КБ каждый, и как только коллекции сделаны, это только 5,9 МБ! У меня есть 500 МБ загрузки на соединение, в котором я сейчас нахожусь.

Вот пример кода

    static void AddMongo(IMongoDatabase MongoDB, List<DocumentUpdate> documents, string objectName)
    {
        Console.WriteLine($"Called Add for {objectName}");
        var collection = MongoDB.GetCollection<BsonDocument>(objectName);
        // initialise write model to hold list of our upsert tasks
        List<BsonDocument> bsonList = new List<BsonDocument>();
        Console.WriteLine($"Adding {documents.Count} for {objectName}");

        // Create new stopwatch.
        Stopwatch stopwatch = new Stopwatch();

        // Begin timing.
        stopwatch.Start();

        // Loop docs and add our PK
        for (var i = 0; i < documents.Count; i++)
        {
            var bsonDoc = BsonDocument.Parse(documents[i].json);
            bsonDoc["_id"] = documents[i].keyValue;
            bsonList.Add(bsonDoc);
        };

        collection.InsertMany(bsonList);

        Console.WriteLine("Added");
        // Stop.
        stopwatch.Stop();

        // Write hours, minutes and seconds.
        Console.WriteLine("Time elapsed: {0:hh\\:mm\\:ss}", stopwatch.Elapsed);
    }

Есть идеи?

EDIT:

После некоторой настройки я могу записать это, вставив один в цикл. Однако это не идеально.

    static void AddMongo(IMongoDatabase MongoDB, List<DocumentUpdate> documents, string objectName)
    {
        Console.WriteLine($"Called Add for {objectName}");
        var collection = MongoDB.GetCollection<BsonDocument>(objectName);
        // initialise write model to hold list of our upsert tasks
        List<BsonDocument> bsonList = new List<BsonDocument>();
        Console.WriteLine($"Adding {documents.Count} for {objectName}");

        // Create new stopwatch.
        Stopwatch stopwatch = new Stopwatch();

        // Begin timing.
        stopwatch.Start();

        // Loop docs and add our PK
        for (var i = 0; i < documents.Count; i++)
        {
            var bsonDoc = BsonDocument.Parse(documents[i].json);
            bsonDoc["_id"] = documents[i].keyValue;
            collection.InsertOneAsync(bsonDoc);
            //bsonList.Add(bsonDoc);
        };

        //collection.InsertMany(bsonList);

        Console.WriteLine("Added");
        // Stop.
        stopwatch.Stop();

        // Write hours, minutes and seconds.
        Console.WriteLine("Time elapsed: {0:hh\\:mm\\:ss}", stopwatch.Elapsed);
    }
...