在我的例子中,我需要使用 removeAll 来比较两个大的 HashSet 来找出差异。为此,我必须将来自不同数据源的所有数据放入内存中,然后进行比较。当每个 HashSet 可能包含超过 300 万条记录时,这会产生内存不足问题。是否有任何方法或库可以减少内存消耗但也可以达到相同的结果?
最佳答案
请注意,如果数据已排序,您可以在单次流式传输数据时使用非常少量的额外内存:
i <- 0
j <- 0
while i < list1.size() and j < list2.size():
if list1[i] == list2[j]:
i <- i+1
j <- j+1
else if list1[i] < list2[j]: //i definetly not in list2
yield list[i]
i <- i+1
else: // j is not in list1
yield list[j]
j <- j+1
yield all elements in list1 from i to list1.size() if there is any
yield all elements in list2 from j to list2.size() if there is any
另一种使用散列的方法只需要加载一个列表(假设这里的数据是集合,如问题中所述,因此不需要重复处理):
load list1 as hash1
for each x in list2:
if x is in hash1:
hash1.remove(x)
else:
yield x
yield all remaining elements in hash1
请注意,如果一个列表也不适合内存,您可以拆分数据并迭代地执行第二种方法。
关于java - 在 Java 中查找两个大组之间差异的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20638903/