.net 如何缓存半静态数据库查询结果?

.net 如何缓存半静态数据库查询结果?,.net,database,caching,.net,Database,Caching,情况: 我正在开发的程序使用一个非常大的SQLite数据库作为数据后端,这是无法更改的,与问题无关。索引以合理的方式应用,所有查询都很快完成,但请求量也非常大 我通过一种特殊的查询发现了一个主要的瓶颈,这种查询将读取一组半静态的行:以前的任何结果都是有效的,但可能会返回更多的行。当存储为C数据结构时,可能的查询结果对的数量在几GB以内 我想到的解决方案是将此查询类型捆绑到缓存类中。它会将特定查询的所有结果存储在类似于字典的结构中。已知查询将仅更新此查询可能添加的结果子集。到目前为止没有问题 提议

情况:

我正在开发的程序使用一个非常大的SQLite数据库作为数据后端,这是无法更改的,与问题无关。索引以合理的方式应用,所有查询都很快完成,但请求量也非常大

我通过一种特殊的查询发现了一个主要的瓶颈,这种查询将读取一组半静态的行:以前的任何结果都是有效的,但可能会返回更多的行。当存储为C数据结构时,可能的查询结果对的数量在几GB以内

我想到的解决方案是将此查询类型捆绑到缓存类中。它会将特定查询的所有结果存储在类似于字典的结构中。已知查询将仅更新此查询可能添加的结果子集。到目前为止没有问题

提议的解决办法:

由于缓存可能超过可用RAM,因此需要允许C对一些缓存结果进行GC。合理地说,应该首先清除使用最少的结果。为此,我唯一知道的解决方案是weakreference

因此,我希望所有假定值较低的结果都只存储得很弱。然后,我将在访问时实现一个连续的自检,或者一个后台线程来检查删除的值,如果发现了许多值,则更积极地将强引用转换为弱引用,以允许GC声明更多值

这个过程会留下那些被认为更有价值的结果作为强参考,除非压力变得非常高

问题:


我是否需要自己实现这一点,或者是否有一个内置的解决方案来完成这一任务或类似的任务?更一般地说:上述建议是一个合理的解决方案吗?

来自微软网站 避免使用弱引用作为内存管理问题的自动解决方案

需要定义可用RAM。 .NET有一个对象大小限制,而字典是一个对象。 限制是1 GB,使用X64,我认为您可以更高。 它不是一个硬限制——它是连续内存

如果要删除使用较少的行,则会产生大量开销 清除旧的很可能会打开

我只想追求第一个GB,看看它能给你带来什么。 您还可以添加第二个和第三个字典,因为它们是独立的对象。 但在某一点上,您将很难获得连续内存

我认为更好的方法是让数据库跟踪使用最多的数据库。 然后就在应用程序启动时下载最常用的1GB