如何在 运行 内存不足的情况下制作大型 3D 阵列?
How do I make a large 3D array without running out of memory?
我有以下方法:
public static void createGiantArray(int size) {
int[][][] giantArray = new int[size][size][size];
}
当我这样调用它的大小为 10,000 时:
createGiantArray(10000);
我收到以下错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
如何在绕过内存异常的同时创建一个 10,000 x 10,000 x 10,000 的数组?
(我知道我当前的方法毫无意义并且失去了范围。我没有 post 附带的额外代码。)
不确定您是否意识到 10,000 x 10,000 x 10,000 整数(每个 4 字节)的 3 维数组总计 3725Gb!您可以使用 -Xmx
标志增加堆大小,但该数量仍然很大。
您需要更改程序的设计。
基本上你不能在内存中维护那个维度的结构。
每个int占用4个字节。
所以你有 10.000 x 10.000 x 10.000 x 4 字节 = 4.000.000.000.000 字节,大约是 4 TB。
您需要将数据保存在数据库(相当大的数据库)上并根据需要访问它们。
第二种可能性是将数据保存在分布式内存系统中,例如许多服务器上的分布式哈希表。例如 4000 台服务器,内存为 1 GB。
如果数据相对稀疏,那么您可以使用不同的数据结构,如 here or here 所述。
我有以下方法:
public static void createGiantArray(int size) {
int[][][] giantArray = new int[size][size][size];
}
当我这样调用它的大小为 10,000 时:
createGiantArray(10000);
我收到以下错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
如何在绕过内存异常的同时创建一个 10,000 x 10,000 x 10,000 的数组?
(我知道我当前的方法毫无意义并且失去了范围。我没有 post 附带的额外代码。)
不确定您是否意识到 10,000 x 10,000 x 10,000 整数(每个 4 字节)的 3 维数组总计 3725Gb!您可以使用 -Xmx
标志增加堆大小,但该数量仍然很大。
您需要更改程序的设计。
基本上你不能在内存中维护那个维度的结构。 每个int占用4个字节。 所以你有 10.000 x 10.000 x 10.000 x 4 字节 = 4.000.000.000.000 字节,大约是 4 TB。 您需要将数据保存在数据库(相当大的数据库)上并根据需要访问它们。 第二种可能性是将数据保存在分布式内存系统中,例如许多服务器上的分布式哈希表。例如 4000 台服务器,内存为 1 GB。
如果数据相对稀疏,那么您可以使用不同的数据结构,如 here or here 所述。