我有一种方法可以从列表列表中查找值的所有组合。目前,它可能会导致以下错误:OutOfMemoryError: GC overhead limit exceeded
。它适用于小型数据集,但是对于较大的数据集会发生错误。有人可以告诉我如何修复我的算法吗?
我的代码如下:
public static <T> List<List<T>> generate(List<List<T>> input, BiFunction<List<T>, T, Boolean> function) {
List<List<T>> output = new ArrayList<List<T>>();
generate(input, 0, output, null, function);
return output;
}
private static <T> void generate(List<List<T>> input, int index, List<List<T>> output, List<T> current, BiFunction<List<T>, T, Boolean> function) {
int next = index + 1;
if (index == 0) {
current = new ArrayList<T>();
}
for (T i : input.get(index)) {
List<T> temp = new ArrayList<T>(current);
if (function == null || !function.apply(temp, i)) {
temp.add(i);
if (next >= input.size()) {
output.add(temp);
}
else {
generate(input, next, output, temp, function);
}
}
}
}
答案 0 :(得分:0)
您还可以通过提供参数-Xms来尝试增加Java虚拟机的内存。如果从eclipse运行,可以在Eclipse主目录中的eclipse.ini文件中指定。您可以将参数-Xms128m更改为-Xmx512m。另一种替代方法是尝试将输入拆分为较小的块以用于递归方法,从而遵循mapreduce模式。
答案 1 :(得分:0)
为了解决这个问题,我更好地利用BiFunction
参数来排除创建时更多无效的组合集。