【发布时间】:2018-08-16 15:32:23
【问题描述】:
我想从存储在ArrayList<double[][]> 中的每个double[][] 数组中删除第一个元素。该列表存储了大量数据(60000 个元素)。
我尝试使用以下代码实现此目的:
public ArrayList<double[][]> correctInput(ArrayList<double[][]> input) {
double[][] temp;
ArrayList<double[][]> correctedinput = new ArrayList<>();
for (int n = 0; n < input.size(); n++) {
temp = new double[input.get(0).length - 1][1];
for (int i = input.get(n).length - 1; i > 0; i--) {
temp[i - 1][0] = input.get(n)[i][0];
}
correctedinput.add(temp);
}
return correctedinput;
}
虽然我的代码适用于较小的列表,但当尝试在大列表中使用它时会导致
java.lang.OutOfMemoryError: GC Overhead Limit Exceeded
可能是因为我正在为列表的每个元素重新定义双精度数组(名为 temp)。 还有一件事:列表中的数组被用作向量,这就是为什么它们是二维数组,尽管它们的长度只有 1。
'temp[0].lenght = 1'
问题是我如何让这个运行更有效地处理非常大的列表。
任何形式的提示将不胜感激。
【问题讨论】:
-
创建新的 ArrayList 后真的需要保持原 ArrayList 不变吗?也许没有足够的空间让两个 ArrayList 一起存在。
-
可能是这样。 ArrayList 不需要保持不变。
-
您能提供一些适当的输入吗?
-
这有点问题,因为它必须在大小为 60000 的 ArrayList 上工作,但以下将导致一个与 60000 非常相似(尽管更小)的 Array。 'for (int i = 0; i
-
保留输入重要吗?随机访问输入重要吗?如果没有,请考虑使用 LinkedList 或 Deque 或类似的,因为它们已针对 O(1) 中的头/尾移除进行了优化。它还将避免您必须为结果创建另一个大数组的情况。
标签: java arrays arraylist out-of-memory