none
这两种情况用哪种泛型比较合适? RRS feed

  • 问题

  • 我遇到了2种比较特殊的情况,不知道用哪种泛型比较合适。想请大家给参谋参谋。

    1。第一种情况是仅需要对一组Keyword进行索引。 Dictionary<>倒是可以。但是实际上我不需要后面的Value,仅对一组int 或 string类型的 Keyword进行索引和快速查找即可。用什么好呢?

    2。第二种情况是Dictionary<>的结构完全可以适用。但是需要索引的数据条目很大,大概10亿条数据左右。 不知道Dictionary<>是否能扛得住,内存是否吃得消。(我是64位系统)


    信奎爷,无所畏惧!!
    2011年5月24日 7:09

答案

  • 第一种情况:直接用List<T>就可以了(比如List<string>,每次添加的时候使用IndexOf函数看看那有没有东西在,http://msdn.microsoft.com/zh-cn/library/s6hkc2c4.aspx

    第二种情况:不建议一下子读取,建议分业一样读取一批,操作一批即可。


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年5月24日 7:22
    版主
  • 2. 这个实际上是一个需求问题,而非编程问题。

    首先 windows x64 系统最大可支持 2TB 的内存。 基本没有问题。

     

    而问题在于,你需要的响应速度是多少? 是否需要极快的响应速度,要是那样,就把所有东西都载入内存,查找起来速度快。当然这样要付出硬件成本。

    如果不需要极快的响应速度,也不想使用太多的硬件,如 Wei_Dong 所说,分块慢慢找也行。


    学习学习....
    2011年5月25日 3:43
  • 第一点:List<T> 即可

    第二点:建议下面两种方式

    1 使用数据库方案。

    2 将这些数据分类并拆成 N 块, 分别放到多个服务器上,一个服务器承载一部分数据,另外再使用一台服务器去解析请求并将请求转发给指定的服务器。


    知识改变命运,奋斗成就人生!
    2011年5月25日 5:16
    版主
  • 第一,如果要快速查找,且数据量不大,HashSet 是个不错的选择。

    第二,如果数据量一旦增大了,建议还是用数据库表吧,所有的 .NET 结构都是基于 GetHashCode 计算哈希索引值的,超过 10 亿的时候 GetHashCode 的返回值不一定均匀,也会有重复,这种情况下会极大降低其索引性能。


    Mark Zhou
    2011年5月25日 7:54
  • dear

    1. .NET有很多集合可以達到你的目標,不知您是否還有其他條件,比如說需不需要排序,您可參考以下查閱
    http://www.dotblogs.com.tw/yc421206/archive/2009/01/25/6941.aspx

    2.那麼大量的資料應該是由資料庫(SQL 或 Oracle)取出,你若想一次取出,只要你硬體設備夠牛當然沒問題,但也得考慮資料搜索時間成本,資料庫的正規化設計也很重要


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年5月28日 17:54
  • 第一,如果要快速查找,且数据量不大,HashSet 是个不错的选择。

    第二,如果数据量一旦增大了,建议还是用数据库表吧,所有的 .NET 结构都是基于 GetHashCode 计算哈希索引值的,超过 10 亿的时候 GetHashCode 的返回值不一定均匀,也会有重复,这种情况下会极大降低其索引性能。


    Mark Zhou


    1. 不需要排序. 只需要单值快速检索即可.

    2. 这个系统是后台服务.为了达到效率最高,所有数据直接写入文件系统, 服务启动时直接加载所有数据,服务器的内存足够大(64bit)


    信奎爷,无所畏惧!!
    2011年5月30日 2:32

全部回复

  • 第一种情况:直接用List<T>就可以了(比如List<string>,每次添加的时候使用IndexOf函数看看那有没有东西在,http://msdn.microsoft.com/zh-cn/library/s6hkc2c4.aspx

    第二种情况:不建议一下子读取,建议分业一样读取一批,操作一批即可。


    如果你有其它意见或私下交流,请发送邮件到:maledong@qq.com;或者请QQ我
    下载MSDN桌面工具(Vista,Win7)
    下载Technet桌面小工具(Vista,Win7)
    慈善点击,点击此处
    2011年5月24日 7:22
    版主
  • 2. 这个实际上是一个需求问题,而非编程问题。

    首先 windows x64 系统最大可支持 2TB 的内存。 基本没有问题。

     

    而问题在于,你需要的响应速度是多少? 是否需要极快的响应速度,要是那样,就把所有东西都载入内存,查找起来速度快。当然这样要付出硬件成本。

    如果不需要极快的响应速度,也不想使用太多的硬件,如 Wei_Dong 所说,分块慢慢找也行。


    学习学习....
    2011年5月25日 3:43
  • 第一点:List<T> 即可

    第二点:建议下面两种方式

    1 使用数据库方案。

    2 将这些数据分类并拆成 N 块, 分别放到多个服务器上,一个服务器承载一部分数据,另外再使用一台服务器去解析请求并将请求转发给指定的服务器。


    知识改变命运,奋斗成就人生!
    2011年5月25日 5:16
    版主
  • 第一,如果要快速查找,且数据量不大,HashSet 是个不错的选择。

    第二,如果数据量一旦增大了,建议还是用数据库表吧,所有的 .NET 结构都是基于 GetHashCode 计算哈希索引值的,超过 10 亿的时候 GetHashCode 的返回值不一定均匀,也会有重复,这种情况下会极大降低其索引性能。


    Mark Zhou
    2011年5月25日 7:54
  • dear

    1. .NET有很多集合可以達到你的目標,不知您是否還有其他條件,比如說需不需要排序,您可參考以下查閱
    http://www.dotblogs.com.tw/yc421206/archive/2009/01/25/6941.aspx

    2.那麼大量的資料應該是由資料庫(SQL 或 Oracle)取出,你若想一次取出,只要你硬體設備夠牛當然沒問題,但也得考慮資料搜索時間成本,資料庫的正規化設計也很重要


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年5月28日 17:54
  • 第一,如果要快速查找,且数据量不大,HashSet 是个不错的选择。

    第二,如果数据量一旦增大了,建议还是用数据库表吧,所有的 .NET 结构都是基于 GetHashCode 计算哈希索引值的,超过 10 亿的时候 GetHashCode 的返回值不一定均匀,也会有重复,这种情况下会极大降低其索引性能。


    Mark Zhou


    1. 不需要排序. 只需要单值快速检索即可.

    2. 这个系统是后台服务.为了达到效率最高,所有数据直接写入文件系统, 服务启动时直接加载所有数据,服务器的内存足够大(64bit)


    信奎爷,无所畏惧!!
    2011年5月30日 2:32