我有一个数据记录应用程序。我每 30 秒记录 10,000 个温度。我需要能够每小时/每天/每周计算 10,000 个项目中每一个的最低/最高/平均温度。最小/最大/平均计算可以在服务器上执行还是需要将每个文档下载到客户端才能执行计算?
安德鲁
我有一个数据记录应用程序。我每 30 秒记录 10,000 个温度。我需要能够每小时/每天/每周计算 10,000 个项目中每一个的最低/最高/平均温度。最小/最大/平均计算可以在服务器上执行还是需要将每个文档下载到客户端才能执行计算?
安德鲁
Either calculate or store a summary in the DB/ on the server. Keep the original data as well, if this is important.
Calculating a summary early & sending that to the client/ human level, is far more efficient than trucking around 10,000 samples that nobody usually wants to drill into.
A really good summary having average, min, max & standard deviation would be statistically comprehensive for almost all purposes.
When the client really wants, then you can bring down the big dataset (10k samples) and display it.
您当然想在服务器上计算它,但您可能会考虑多种方法:
您可以将这些存储在您使用每个样本手动更新的特定文档中。这可能有效,但您会对单个文档施加很大压力,并且可能导致并发问题。
您可以编写一个 Map/Reduce 索引来计算总数。每次您编写新文档时,RavenDB 都会使用新的总数更新您的索引。您可以将总值除以总数以获得平均值,并且可以轻松使用 min 和 max 函数。由于您想按不同的时间间隔查看这些结果,因此您需要多个索引。
我实际上写了一个小演示程序来做这件事。它不是温度,而是从模拟压力表记录 PSI 值。但概念是相同的。如果您仔细阅读评论,可能会发现其中有一些捷径。
项目地点:Raven Sensors
我在 RavenDB 的当前版本是 2.0.2261 时写了这个。我已经有一段时间没有更新它了,但它应该仍然可以工作并且是相关的。
我还没有做太多,但 RavenDB 2.5 添加了一个名为Dynamic Aggregation的功能。它还通过工作室公开为动态报告。本质上,这会在查询时进行聚合。您可能会发现表达您感兴趣的聚合要容易得多,但它可能比 map-reduce 方法慢得多。你可能想尝试一下。性能差异可能归结为正在聚合的集合中有多少项目。