一种字典,可以将不经常访问的元素保存到磁盘中

Liu*_*sai 15 c# database serialization dictionary out-of-memory

在我的应用程序中,我使用字典(支持添加,删除,更新和查找),其中键和值都可以或可以被序列化(值可能是非常大的对象图).当字典变得如此之大以至于将其完全保存在内存中时偶尔会触发OutOfMemoryException(有时在字典方法中,有时在代码的其他部分中),我来到了这一点.

尝试用数据库完全替换字典后,性能下降到不可接受的水平.

对字典使用模式的分析表明,通常较小部分的值是"热"(经常访问),其余(较大部分)是"冷"(很少或从不访问).如果新值加热或冷,很难说何时添加新值,而且,随着时间的推移,某些值可能会在热部件和冷部件之间来回移动.

我认为我需要一个能够在低内存事件中将其冷值刷新到磁盘的字典的实现,然后根据需要重新加载其中的一些并将它们保留在内存中,直到它们发热时发生下一个低内存事件/冷状态将被重新评估.理想情况下,实现应根据应用程序中的内存使用情况,整齐地调整其冷热部件的大小和刷新间隔,以最大限度地提高整体性能.因为应用程序中存在多个字典实例(具有不同的键/值类型),我认为,他们可能需要协调他们的工作流程.

你能建议如何实施这样的字典吗?

Ser*_*zin 0

只是一个想法 - 从未这样做过也从未使用过System.Runtime.Caching

围绕MemoryCache实现一个包装器,它将:

  1. 添加指定了驱逐回调的项目。回调会将被逐出的项目放入数据库中。
  2. 如果检索过程中 MemoryCache 中不存在该项目,则从数据库中获取该项目并将其放回到 MemoryCache 中。
  3. 如果您预计会有大量对数据库和内存中丢失的项目的请求,您可能还需要为当前/丢失的项目实现布隆过滤器或缓存键。