gpt4 book ai didi

java - 调整巨大数组的大小

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:22 25 4
gpt4 key购买 nike

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

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

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

最佳答案

我会使用 List ,其中每个 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);
}

关于java - 调整巨大数组的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7298534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com