【发布时间】:2012-04-04 03:26:32
【问题描述】:
我正在使用 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);
}
这是几次运行的输出。请注意,我正在写一个 local RavenDB 实例(构建 701)。我知道网络上的性能会更差,但我先在本地进行测试。
一次运行:
标记对象数量:671
在 RavenDB 中保存 Marker 数据 -- 处理时间:1308 ms
再跑一次:
标记对象数量:670
在 RavenDB 中保存 Marker 数据——处理时间:1266 毫秒
再跑一次:
标记对象数量:667
在 RavenDB 中保存 Marker 数据——处理时间:625 毫秒
再跑一次:
标记对象数量:639
在 RavenDB 中保存 Marker 数据——处理时间: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"
}
这是预期的性能吗?
有没有更好的方法(最佳实践)插入以提高速度?
在我可以定位的地方是否有可用的插入基准?
【问题讨论】:
-
注意: SaveChanges() 在后台使用批量插入。如果您启用了日志记录,您会看到它对“/bulk_docs”端点进行 POST,请参阅此处的屏幕截图以获取示例,ayende.com/blog/154337/ravendb-self-optimizing-ids
标签: ravendb