Java:Should I use a `HashSet` or a `TreeSet` for a very large dataset?
2022-12-13 15:52 杭伟 阅读(36) 评论(0) 编辑 收藏 举报这是StackOverflow上一个有意思的提问,记录一下。
原地址在这
翻译:
对于大型数据集,应该使用”哈希集”还是”树集”?
(因为HashTable有着O(1)的查找速度比树结构更有效率,虽然HashTable的数据无序,但这不是本文的重点)
我需要在数据结构中存储2到1500万个帐户(长度为15的String),以进行查找和检查唯一性。
最初我计划将它们存储在HashSet中,但我怀疑由于哈希冲突而导致查找速度会变慢,并且最终会比TreeMap(使用二叉搜索)慢。
不要求对数据进行排序。我正在使用Java7。我有专用于该应用程序的64G系统和48G。
此问题不是HashSet和TreeSet性能测试的重复项,因为该问题与向Set中添加元素的性能有关,而此问题与为重复的值检查现有Set的性能有关。
如果您有48 GB的专用内存用于200万至1500万条记录,则最好的选择是使用HashMap<Key, Record>,根据您的要求,密钥为Integer或String。
只要向Map提供足够的内存并具有适当的负载系数,就可以满足哈希冲突的所有要求。
我建议使用以下构造函数:new HashMap<>(13_000_000);(比您预期的记录数多30%-HashMap的实现会自动将其扩展到2^24单元)。
告诉您的应用程序,这个Map从一开始就很大,因此不需要在填充时自动增长。
HashMap使用O(1)作为其成员的访问时间,而TreeMap使用O(log n)的查找时间,但可以更有效地利用内存,并且不需要聪明的哈希函数。但是,如果您使用String或Integer键,则不必担心设计哈希函数,并且恒定时间查找将是一个巨大的改进。另外,TreeMap / TreeSet的另一个优点是排序的顺序,您说过您并不在意;使用HashMap。
如果列表的唯一目的是检查唯一的帐号,那么我上面所说的所有内容仍然适用,但是正如您在问题中所述,应使用HashSet<String>,而不是HashMap 。性能建议和构造函数参数仍然适用。
作者:hangwei
出处:http://www.cnblogs.com/hangwei/
关于作者:专注于开源平台,分布式系统的架构设计与开发、数据库性能调优等工作。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
如果您觉得文章对您有帮助,可以点击文章右下角“推荐”一下。您的鼓励是作者坚持原创和持续写作的最大动力!