【问题标题】:Size of a dictionary [duplicate]字典的大小[重复]
【发布时间】:2009-06-10 10:48:54
【问题描述】:

我目前正在用 C# 设计一个网站,它使用一些非常复杂的代码来生成一个搜索列表,我目前正在将其设计为类似 的结构。

我使用树的主要原因是这个网站的流量很大并且有一个非常复杂的搜索过滤器,这意味着可扩展性非常重要。但是,我担心树的内存需求可能会超过每次简单地重新计算值的有效处理需求。

是否有可靠的方法来测量 C# 中字典的大小? Marshal.SizeOf() 方法不允许这样做,因为代码不是非托管的。

【问题讨论】:

标签: c# memory-management tree


【解决方案1】:

最好的办法是在网站上运行不同模型下的负载并检查the relevant performance counters

为简化起见,您可以只提取创建和存储数据结构的代码,并将其嵌入到控制台应用程序中。运行模拟负载并检查那里的性能计数器。您可以改变事物并衡量对内存消耗和垃圾收集的影响。这样做会隔离您想要测量的效果。

如果您在想,“哎呀,这听起来需要做很多工作”,那么您最好还是购买更多内存。

【讨论】:

  • 听起来确实需要做很多工作,但我不确定购买更多内存是否可行,因为字典中很容易有几十万个对象!
  • 工作量并不大。编写模拟不同场景和策略的代码。通过多个会话运行每个策略,每个会话运行 5-10 分钟或更长时间,并每隔 15 或 20 秒查询一次重要的性能计数器。在运行结束时,自动生成带有每个周期输出的 Excel 工作表和图表。完成所有这些设置后,按下开始按钮。去吃午饭……3小时后回来。
  • 这听起来是个不错的计划,我会在稍后的构建中给自己一天的时间来完成它!
【解决方案2】:

一种方法...用任意数量的元素初始化树,测量进程消耗的内存大小,添加 1000 个新元素,再次测量内存大小,减去和除法。

【讨论】:

  • 我认为这对我的老板来说有点太不准确了,虽然这是一个可行的选择
【解决方案3】:

您可以使用单个字典创建一个小应用程序,然后使用 WinDbg 或 ClrProfiler 在多个场景中对其进行分析。

我认为没有办法在运行时获取对象的总大小(除了使用反射遍历内部字段?)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    相关资源
    最近更新 更多