调整大型数组的大小

时间:2011-09-04 10:18:56

标签: java arrays memory

我正在处理我的应用程序中的大型数组,需要调整它们的大小。

假设您有一个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
    }
}

那么,有没有办法在不需要额外临时内存的情况下调整数组大小?

2 个答案:

答案 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[]