我正在处理我的应用程序中的大型数组,需要调整它们的大小。
假设您有一个2Gb的数组,并且您希望将其调整为3Gb。有没有办法在不需要暂时5Gb的情况下调整它的大小?
例如,给定使用-Xmx1G
标志的1Gb堆:
public class Biggy {
public static void main(String[] args) {
int[] array;
array = new int[100 * 1000 * 1000]; // needs 400Mb, works
array = null; // needed for GC
array = new int[150 * 1000 * 1000]; // needs 600Mb, works
array = null; // needed for GC
array = new int[100 * 1000 * 1000]; // needs 400Mb, works
array = Arrays.copyOf(array, 150 * 1000 * 1000); // needs 1000Mb, throws out of memory
}
}
那么,有没有办法在不需要额外临时内存的情况下调整数组大小?
答案 0 :(得分:3)
我会使用List< int []>其中每个int []是固定大小。例如1.28亿。增长整个“集合”只涉及添加另一个数组。我在直接内存中使用IntBuffer,这避免了使用堆的需要。 (或使用内存映射文件,这意味着它不使用堆或直接内存;)这是丑陋的,我使用包装类来隐藏丑陋。它确实表现得非常好。对于内存映射文件,我可以使用大于物理内存的“数组”。
private final List<IntBuffer> array = new ArrayList<IntBuffer>();
public int get(long n) {
return array.get((int)(n >> 27)).get(n & ((1 << 27) -1));
}
public void put(long n, int v) {
return array.get((int)(n >> 27)).put(n & ((1 << 27) -1), v);
}
答案 1 :(得分:0)
我无法找到使用数组的问题的解决方案,如果你想创建一个新的更大的数组,你必须将旧的数组保留在内存中,直到数据被复制到新的数组,所以你必须即使在很短的时间内都在内存中。 (如果我错了,请纠正我)
我想知道你是否需要不断增长你的int集合,为什么不使用List<int>
代替int[]
?