【问题标题】:How can I use a very large dictionary in C#?如何在 C# 中使用非常大的字典?
【发布时间】:2011-04-01 18:27:22
【问题描述】:

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

谁能告诉我是否仍然可以使用字典类,或者我是否需要使用其他类?

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

【问题讨论】:

  • 您是否尝试过启动一个使用这么多内存的字典实例?另外,这个应用是部署在 32 位还是 64 位系统上?
  • 为什么是字典或内存数据结构?为什么不是数据库?
  • SqlLite 有一个很酷的内存数据库,可能对您的情况很感兴趣。
  • 如果你在2gb上计算并且你控制服务器本身,那就拍吧。使用“3gb of free 16 available”然后使用 14 of ree 16 没有服务器感觉更好。内存不是这样工作的,没有什么比 RAM 更快用于 r/w 访问了。如果内存负载有问题,这里的其他 cmets 更值得!
  • 我听说过用于 C++ 的外部内存 stl 容器,但我不知道 c#。 c# 中是否有类似的替代方案?

标签: c# memory


【解决方案1】:

简答

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

长答案

你确定要吗?如果不了解您的应用程序的更多信息,就很难知道该建议什么。

  • 数据来自哪里?一份文件?文件?数据库?服务?
  • 这是一种缓存机制吗?如果是这样,您是否可以在一段时间未访问缓存项目后使它们过期?这样,您就不必一直将所有内容都保存在内存中。
  • 正如其他人所建议的那样,如果您只是想存储大量数据,您可以只使用数据库吗?这样您就不必一次将所有信息都保存在内存中。借助索引,大多数数据库都非常擅长执行快速检索。您可以将此方法与缓存结合使用。
  • 内存中的数据是只读的,还是必须在发生变化时将其持久化回某个存储?
  • 可扩展性 - 您是否希望存储在此字典中的数据量会随着时间的推移而增加?如果是这样,您将遇到购买可以处理这么多数据的机器非常昂贵的情况。如果是这种情况(想到 AppFrabric),您可能希望查看分布式缓存系统,这样您就可以水平扩展(更多机器)而不是垂直扩展(一个非常昂贵的故障点)。

更新

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 附带说明...应用程序需要编译为 64 位(或 64 位机器上的任何 cpu)才能使进程占用超过 2GB 的内存(我认为它无论如何都是 2GB)。
    【解决方案3】:

    当您说 1-2GB 数据时,我假设您的意思是这些项目是累积包含 1-2GB 的复杂对象。

    除非它们是结构体(它们不应该是结构体),否则字典不关心项目的大小。
    只要你有少于大约 224 件物品(我从帽子里拿出这个数字),你就可以尽可能多地存储在内存中。

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

    【讨论】:

      【解决方案4】:

      你可以,但对于尽可能大的字典,最好使用数据库

      【讨论】:

        【解决方案5】:

        使用数据库。 确保你有一个好的数据库模型,放置正确的索引,然后就可以了。

        【讨论】:

          【解决方案6】:

          您可以使用subdictionaries

          Dictionary<KeyA, Dictionary<KeyB ....
          

          其中KeyAKeyB 的一些共同部分。

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

          【讨论】:

          • 这如何解决这个问题?这看起来像一个模糊的缓存分区方案,与回答用户是否应该缓存来自数据库的结果无关。
          • 它解决了一个问题,是的,它是分区方案(字典的问题 - 内存分配,当内存结束时它会分配两倍的内存,使用分区方案可以使过程不那么痛苦),并且似乎这是您希望在 RAM 中拥有非常大的字典(在数据库中没有)的唯一方法,当然,如果您有很多 RAM,否则您会内存不足。您也可以尝试将您的应用程序切换到 64 位 - 也许它应该是您应该首先尝试的...
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-02
          • 2017-04-08
          • 2021-09-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-09
          相关资源
          最近更新 更多