如何在C#中使用非常大的字典?

时间:2011-04-01 18:27:23

标签: c# memory

我想在C#应用程序中使用查找映射或字典,但预计会存储1-2 GB的数据。

有人可以告诉我是否仍然可以使用字典课程,或者我是否需要使用其他课程?

编辑:我们有一个现有的应用程序,它使用oracle数据库来查询或查找对象详细信息。然而它太慢了,因为相同的对象被反复查询。我觉得在这种情况下使用查找映射可能是理想的,以改善响应时间。但是我担心尺寸是否会成为问题

6 个答案:

答案 0 :(得分:7)

简答

是。如果您的机器有足够的内存用于结构(以及程序和系统的其余部分(包括操作系统)的开销)。

长答案

你确定要吗?如果不了解您的应用程序,很难知道建议的内容。

  • 数据来自何处?一份文件?文件?一个数据库?服务?
  • 这是一种缓存机制吗?如果是这样,一旦他们暂时没有被访问,你可以将项目从缓存中过期吗?这样,您就不必一直将所有内容都保存在内存中。
  • 正如其他人所建议的那样,如果您只是想存储大量数据,那么您可以使用数据库吗?这样您就不必一次将所有信息都存储在内存中。通过索引,大多数数据库都能很好地执行快速检索。您可以将此方法与缓存结合使用。
  • 将在内存中的数据是只读的,还是在发生变化时必须将其保留回某个存储区?
  • 可伸缩性 - 您是否预计随着时间的推移,将存储在此字典中的数据量会增加?如果是这样,你将会遇到购买能够处理这些数据量的机器非常昂贵的问题。如果是这种情况,您可能希望查看分布式缓存系统(AppFrabric浮出水面),因此您可以横向扩展(更多计算机)而不是垂直扩展(一个非常昂贵的失败点)。

<强>更新

根据海报的编辑,听起来缓存在这里会有很长的路要走。有很多方法可以做到这一点:

  • 简单的字典缓存 - 只需按要求缓存内容。
  • Memcache
  • Caching Application Block我不是这个实施的忠实粉丝,但其他人已经取得了成功。

答案 1 :(得分:1)

只要你使用64GB的机器,是的,你应该可以使用那么大的字典。但是如果你有太多的数据,数据库可能更合适(cassandra实际上只是一个巨大的字典,而且总是有MySQL)。

答案 2 :(得分:1)

当你说1-2GB的数据时,我认为你的意思是这些项目是累积含1-2GB的复杂对象。

除非它们是结构(并且它们不应该是),否则字典并不关心这些项目的大小 只要你有少于2个 24 项目(我从帽子中取出这个数字),你可以尽可能多地存储在内存中。

但是,正如其他人所建议的那样,您应该使用数据库 您可能希望使用内存数据库,例如SQL CE。

答案 3 :(得分:0)

你可以但是对于像你最好使用数据库

那样大的字典

答案 4 :(得分:0)

使用数据库。 确保你有一个好的数据库模型,输入正确的索引,然后离开。

答案 5 :(得分:-2)

您可以使用subdictionaries

Dictionary<KeyA, Dictionary<KeyB ....

其中KeyAKeyB的一些常见部分。

例如,如果您有一个String字典,则可以将第一个字母用作KeyA