【问题标题】:Caching strategy缓存策略
【发布时间】:2010-10-06 02:40:35
【问题描述】:

我在启动时加载了来自服务器的大量静态数据。我将它加载到 foo 对象的哈希表中。用户有一个下拉菜单,他们可以在其中选择这些对象之一。默认情况下,有 50,000 个对象会占用大量内存。我正在尝试减少内存

在监测使用情况后,事实证明大多数人只使用了大约 1,000 个。我想要它,所以 gui 只加载那 1000 个,如果他们需要选择 1000 个之外的一个,那么他们可以返回服务器或磁盘。

这样做的最佳方法是什么。 .

【问题讨论】:

  • 这是网络应用还是 winform?

标签: c# winforms memory


【解决方案1】:

我假设您正在其他地方过滤此列表...否则这是一个相当多的列表。在访问数据库之前访问新的、更精简的静态缓存的最简单方法是通过单一方法传递所有请求:

public yourClass GetDesiredObject(string lkupValue)
{
  if (yourCachedHashtable.ContainsKey(lkupValue))
  {
     return yourCachedHashtable[lkupValue]
  }
  else
  {
     //Hit the db to retrieve the object values.
     yourClass obj = yourDatabaseCode.GetNewObject(lkupValue);
     //Add to the cache if desired.
     yourCachedHashtable.Add(lkupValue, obj);
     return obj;
  }
}

【讨论】:

    【解决方案2】:

    先加载1000的问题是

    1. 谁会滚动 1000?

    2. 返回磁盘会导致下拉菜单重置,它们必须再次滚动。

    解决方案

    1. 为什么不实现自动搜索下拉菜单,并尝试缓存应用程序块,这对我来说非常适合处理大量数据。

    2. 查看 devexpress 下拉编辑,不过您需要购买他们的控件。

    【讨论】:

    • 我同意这个解决方案,允许他们通过输入前几个字母来进行部分搜索,对于这么长的列表来说绝对是最佳解决方案。
    【解决方案3】:

    您有一个包含 50000 个项目的下拉列表?这似乎有点过分了。也许是列表视图控件?您也可以将列表视图创建为虚拟列表视图 - 在这种模式下,它只会根据需要加载项目,如果其他项目滚动到视图中,则可以加载它们。由于列表视图中有这么多项目,我建议您使用某种搜索控件,用户可以使用它来缩小项目列表的范围。

    【讨论】:

      【解决方案4】:

      50,000 个对象对于下拉菜单项来说似乎有点过多。也许您想查看其他小部件,例如带有分页的表格...

      【讨论】:

        【解决方案5】:

        根据您的数据的性质,忘记整个事情并将其留给操作系统如何处理?将其放入内存映射文件中。

        【讨论】:

          猜你喜欢
          • 2012-09-05
          • 2020-08-03
          • 2011-11-12
          • 2011-01-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-21
          相关资源
          最近更新 更多