Как следует из названия, мне нужно вставить 100 000 записей в коллекцию DocumentDb программно. Эти данные будут использованы для создания отчетов позже. Я использую SDK Azure Documents и хранимую процедуру для массовых вставок документов (см. Вопрос Массивная вставка Azure documentdb с использованием хранимой процедуры).
В следующем приложении консоли показано, как я вставляю документы.
InsertDocuments генерирует 500 тестовых документов для перехода к хранимой процедуре. Основная функция вызывает InsertDocuments 10 раз, вставив 5000 документов в целом. Запуск этого приложения приводит к тому, что 500 документов будут вставлены каждые несколько секунд. Если я увеличиваю количество документов на звонок, я начинаю получать ошибки и потерять документы.
Можно ли рекомендовать более быстрый способ вставки документов?
static void Main(string[] args)
{
Console.WriteLine("Starting...");
MainAsync().Wait();
}
static async Task MainAsync()
{
int campaignId = 1001,
count = 500;
for (int i = 0; i < 10; i++)
{
await InsertDocuments(campaignId, (count * i) + 1, (count * i) + count);
}
}
static async Task InsertDocuments(int campaignId, int startId, int endId)
{
using (DocumentClient client = new DocumentClient(new Uri(documentDbUrl), documentDbKey))
{
List<dynamic> items = new List<dynamic>();
// Create x number of documents to insert
for (int i = startId; i <= endId; i++)
{
var item = new
{
id = Guid.NewGuid(),
campaignId = campaignId,
userId = i,
status = "Pending"
};
items.Add(item);
}
var task = client.ExecuteStoredProcedureAsync<dynamic>("/dbs/default/colls/campaignusers/sprocs/bulkImport", new RequestOptions()
{
PartitionKey = new PartitionKey(campaignId)
},
new
{
items = items
});
try
{
await task;
int insertCount = (int)task.Result.Response;
Console.WriteLine("{0} documents inserted...", insertCount);
}
catch (Exception e)
{
Console.WriteLine("Error: {0}", e.Message);
}
}
}