我有这个:
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/