.net - 存储原始数据以进行复杂计算
问题描述
我们有一个 Web 应用程序,用于报告所有数据在关系数据库中的位置。对于大多数报告,我们可以使用引擎提供的内置聚合器功能或通过预先计算和缓存结果来完成所有计算。向用户生成这些报告的性能非常快。
只有两种情况,我们需要运行一个非常复杂的基于反复试验的算法,这种算法无法通过 SQL 完成,也无法在数据库中预先缓存任何东西。还有太多的输入变化,无法缓存结果。该算法还需要同时获取所有数据,因此无法并行划分和执行或以块的形式获取。
因此,我们目前正在通过从数据库中获取原始数据并在 C# 中计算逻辑来准备这些报告。然而,这很慢,因为我们需要将所有目前可以达到 8GB 的数据提取到后端。此外,许多繁重的并发请求可能会导致 VM 的可用内存受到限制。
我们已经获取了最少数量的行和列(2 个数字字段和 1 个日期字段)来执行算法,因此我们无法通过减少传输数据的大小来提高性能。因此,我们尝试通过执行以下操作将其加速为 PoC:
- 用于缓存原始数据的内存数据库(Redis、Memcached):虽然从数据库中读取速度非常快,但我们在反序列化方面遇到了一个大问题,我们拥有的数据可能需要长达 9 秒的时间。我们尝试了多种反序列化算法,但对于大量数据,它们都不够快。
- 将原始数据存储在内存中(本地缓存):通过在不到一秒的时间内完成计算,这显然提供了可能的最佳性能。但是,这并不理想,因为它不可扩展,甚至可能根据许多在线来源导致垃圾收集问题。
我的问题是从架构的角度是否有建议,我们可以将报告加速到接近本地缓存速度的速度,而不受它所造成的限制。如果有帮助,我们会使用 .NET Core 和 SQL Server。
解决方案
也许我们在数据库系统的时间序列分析组件中采用的一种技术流水线会有所帮助。您可以在此处阅读有关该技术的信息(匿名,无需注册):Pipelining Vector-Based Statistical Functions for In-Memory Analytics
我了解您使用的是 SQL Server;这不是我们数据库系统的插件。我阅读了您的问题并认为该技术可能会有所帮助,因为它可以消除缓存所有数据的需要,并保留使用 SQL 的能力(管道是通过在 SQL 语句中嵌套函数构建的)。但是,如果数据不是时间序列,则该技术也可能不适用。
推荐阅读
- python - Google Photos API - 新版本?
- reactjs - React:用户选择的图像与来自 res.data 的结果不同
- visual-studio - 如何在 Visual Studio 中启用 TwinCAT 远程状态图标
- flutter - 在颤振中获得 youtube 许可时仅显示进度对话框
- azure-devops - Azure DevOps Service Hooks 和 Service Coonection 有什么区别
- paste - 在exams2moodle的文件名中使用paste0
- python - 如何在 Python 中正确执行带参数的 MSSQL 存储过程
- pandas - 如何为“start_date”列和“end_date”列的每一行创建pandas.date_range()?
- flutter - 自动化 app_localizations.dart 生成
- excel - VBA将数据透视数据复制到列中的下一个空白单元格