存储原始数据以进行复杂的计算

时间:2020-05-04 19:58:16

标签: .net design-patterns architecture in-memory-database

我们有一个Web应用程序,用于报告所有数据驻留在关系数据库中的位置。对于大多数报告,我们可以使用引擎提供的内置聚合器功能或通过预先计算和缓存结果来进行所有计算。向用户生成这些报告的性能非常快。

在仅有两种情况下,我们需要根据试验和错误运行非常复杂的算法,而这是无法通过SQL完成的,也无法将任何内容预先存储在数据库中。输入变量太多,无法缓存结果。该算法还需要同时获取所有数据,因此无法进行并行分割和分段获取。

因此,我们目前正在通过从数据库获取原始数据并计算C#中的逻辑来准备那些报告。但是,这很慢,因为我们需要获取目前可以到达后端的8GB的所有数据。另外,许多繁重的并发请求可能会导致VM的可用内存受到限制。

我们已经获取了最少数量的行和列(2个数字字段和1个日期字段)来执行该算法,并且基于此,我们无法通过减小传输数据的大小来提高性能。因此,我们尝试通过以下操作将其作为PoC进行加速:

  • 用于缓存原始数据的内存数据库(Redis,Memcached):尽管从数据库中读取数据的速度非常快,但我们在反序列化方面遇到了一个大问题,该问题可能需要9秒钟才能处理我们拥有的数据。我们尝试了多种反序列化算法,但是它们都没有足够快的速度来处理大量数据。
  • 将原始数据存储在内存(本地缓存)中:通过在不到一秒钟的时间内完成计算,显然可以提供最佳性能。但是,由于它不具有可伸缩性,因此并不理想,根据许多在线资源,它甚至可能导致垃圾回收问题。

我的问题是,从体系结构的角度来看是否存在建议,我们可以在不导致限制的情况下将报告加快到接近本地缓存速度的速度。如果有帮助,我们可以使用.NET Core和SQL Server。

1 个答案:

答案 0 :(得分:0)

也许我们在数据库系统的时间序列分析组件(流水线)中采用的一种技术会有所帮助。您可以在此处阅读有关该技术的信息(匿名,无需注册):Pipelining Vector-Based Statistical Functions for In-Memory Analytics

我了解您正在使用SQL Server;这不是我们数据库系统的插件。我读了您的问题,并认为该技术可能会有所帮助,因为它可能不需要缓存所有数据,并保留了使用SQL的能力(通过在SQL语句中嵌套函数来构建管道)。但是,如果数据不是时间序列,则该技术也可能不适用。