Я работаю над прототипом, используя RavenDB, для моей компании, чтобы оценить. У нас будет много потоков, вставляющих тысячи строк каждые несколько секунд, и много потоков, читающих одновременно. Я провел первый простой тест на вставку, и прежде чем идти дальше, я хочу убедиться, что я использую рекомендованный способ получить наилучшую производительность для вставок RavenDB.
Я считаю, что есть опция массовой вставки. Я еще не исследовал это, поскольку я не уверен, что это необходимо. Я использую .NET API, и мой код выглядит следующим образом:
Debug.WriteLine("Number of Marker objects: {0}", markerList.Count);
StopwatchLogger.ExecuteAndLogPerformance(() =>
{
IDocumentSession ravenSession = GetRavenSession();
markerList.ForEach(marker => ravenSession.Store(marker));
ravenSession.SaveChanges();
}, "Save Marker data in RavenDB");
StopwatchLogger просто вызывает действие, помещая вокруг него секундомер:
internal static void ExecuteAndLogPerformance(Action action, string descriptionOfAction)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
action();
stopwatch.Stop();
Debug.WriteLine("{0} -- Processing time: {1} ms", descriptionOfAction, stopwatch.ElapsedMilliseconds);
}
Вот результат нескольких прогонов. Обратите внимание, я пишу в локальный экземпляр RavenDB (сборка 701). Я знаю, что в сети производительность будет хуже, но я сначала тестирую локально.
Один прогон:
Количество объектов Маркер: 671
Сохранение данных маркера в RavenDB - время обработки: 1308 мс
Еще один прогон:
Количество объектов Маркер: 670
Сохранение данных маркера в RavenDB - время обработки: 1266 мс
Еще один прогон:
Количество объектов Маркер: 667
Сохранение данных маркера в RavenDB - время обработки: 625 мс
Еще один прогон:
Количество объектов Маркер: 639
Сохранение данных маркера в RavenDB - время обработки: 639 мс
Ха. 639 объектов за 639 мс. Каковы шансы на это? Во всяком случае, это одна вставка в миллисекунду, что будет 1000 каждую секунду.
Объект / документ Marker не имеет к нему особого отношения. Вот пример того, который уже был сохранен:
{
"ID": 14740009,
"SubID": "120403041588",
"ReadTime": "2012-04-03T13:51:45.0000000",
"CdsLotOpside": "163325",
"CdsLotBackside": "163325",
"CdteLotOpside": "167762",
"CdteLotBackside": "167762",
"EquipmentID": "VA_B"
}
Это ожидаемая производительность?
Есть ли лучший способ (лучшая практика) для вставки для увеличения скорости?
Есть ли где-нибудь доступные эталонные тесты, на которые я могу ориентироваться?