java - 计算大长数组中的不同值(性能问题)

标签 java performance hashset

我有这个:

long hnds[] = new long[133784560]; // 133 million

然后我快速填充数组(几毫秒),然后我想知道唯一(即不同)值的数量。现在,我什至不需要这种实时性,我只需要尝试几个变体,看看每个变体给出了多少个唯一值。

我尝试过,例如这个:

import org.apache.commons.lang3.ArrayUtils;
....
HashSet<Long> length = new HashSet<Long>(Arrays.asList(ArrayUtils.toObject(hnds)));
System.out.println("size: " + length.size());

等了半个小时后,出现堆空间错误(我有Xmx4000m)。

我还尝试初始化 Long[] hnds 而不是 long[] hnds,但是数组的初始填充需要很长时间。或者例如在添加值时从一开始就使用 Set,但也需要永远。有没有办法计算 long[] 数组的不同值而无需永远等待?如果有必要,我会将其写入文件,只是以某种方式。

最佳答案

我最好的建议是使用像 fastutil ( http://fastutil.di.unimi.it/ ) 这样的库,然后使用自定义的未装箱哈希集:

import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
System.out.println(new LongOpenHashSet(hnds).size());

(另外,如果您可以接受近似答案,您可以尝试更多更有效的算法;有关详细信息,请参阅 this paper 等。)

关于java - 计算大长数组中的不同值(性能问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34687868/

相关文章:

java - 将图像加载到 ImageView 中会导致 "I/Choreographer: Skipped 139 frames! The application may be doing too much work on its main thread."错误

java - 何时需要在 lambda 表达式中指定参数类型

performance - golang json/gob/xml 中的序列化性能

java - 无法通过引用方法传递元素来将元素添加到集合中

java - HashMap和HashSet根据执行顺序不同的执行时间?

java - 即使在其他平台上运行,也使用 Maven 程序集插件设置 Linux 文件权限?

java - 如何使用分隔线上的箭头按钮(或类似按钮)移动/调整窗扇表单的窗扇大小?

SQL Server - 加入 4 个快速查询给我一个慢速查询

javascript - 为什么我在 Chrome 的网络瀑布功能中看到请求之间存在很大差距?

c# - 删除自定义 HashSet