gpt4 book ai didi

c# - C# 中 coSTLy 对象的内存管理/缓存

转载 作者:太空狗 更新时间:2023-10-29 21:35:19 25 4
gpt4 key购买 nike

假设我有以下对象

public class MyClass
{
public ReadOnlyDictionary<T, V> Dict
{
get
{
return createDictionary();
}
}
}

假设ReadOnlyDictionary是围绕 Dictionary<T, V> 的只读包装器.

createDictionary方法需要很长时间才能完成并且返回的字典相对较大。

显然,我想实现某种缓存,这样我就可以重用 createDictionary 的结果但我也不想滥用垃圾收集器并使用太多内存。

我想到了使用 WeakReference对于字典,但不确定这是否是最佳方法。

你会推荐什么?如何正确处理可能被多次调用的昂贵方法的结果?

更新:

我对 C# 2.0 库(单个 DLL,非可视化)的建议很感兴趣。该库可能会在 Web 应用程序的桌面中使用。

更新 2:

这个问题也与只读对象有关。我将属性的值从 Dictionary 更改为至 ReadOnlyDictionary .

更新 3:

T是相对简单的类型(例如字符串)。 V是自定义类。您可能会假设 V 的实例创建成本高昂。字典可能包含 0 到几千个元素。

假定从单个线程或具有外部同步机制的多个线程访问代码。

如果字典在没有人使用的情况下进行 GC 处理,我也无所谓。我试图在时间(我想以某种方式缓存 createDictionary 的结果)和内存开销(我不想占用内存超过必要时间)之间找到平衡点。

最佳答案

WeakReference 不是缓存的好解决方案,因为如果没有其他人引用您的字典,您的对象将无法在下一次 GC 中存活下来。您可以通过将创建的值存储在成员变量中来创建一个简单的缓存,如果它不为 null 则重用它。

这不是线程安全的,在某些情况下,如果您对字典进行大量并发访问,您最终会多次创建字典。您可以使用双重检查锁定模式来防止这种情况,同时将性能影响降到最低。

为了进一步帮助您,您需要指定并发访问是否对您来说是个问题,以及您的字典消耗了多少内存以及它是如何创建的。如果例如该字典是一个昂贵查询的结果它可能有助于简单地将字典序列化到光盘并重复使用它直到您需要重新创建它(这取决于您的特定需求)。

缓存是内存泄漏的另一种说法,如果您没有明确的策略何时应从缓存中删除对象。由于您正在尝试 WeakReference 我假设您不知道什么时候是清除缓存的好时机。

另一种选择是将字典压缩成内存占用较少的结构。你的字典有多少键,值是多少?

关于c# - C# 中 coSTLy 对象的内存管理/缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10971845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com