如何在不耗尽内存的情况下制作大型 3D 数组?
Posted
技术标签:
【中文标题】如何在不耗尽内存的情况下制作大型 3D 数组?【英文标题】:How do I make a large 3D array without running out of memory? 【发布时间】:2015-03-24 17:16:34 【问题描述】:我有以下方法:
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 的数组?
(我知道我当前的方法毫无意义并且失去了作用域。我没有发布附带的额外代码。)
【问题讨论】:
您可以将数组类型更改为更动态的类型(仅在需要时增加)或增加您的 java 内存以更改执行参数,例如Xmx 和 Xms 值 顺便说一句:10,000^3 == 1,000,000,000,000
,即~931 GB
内存。真的吗?
@dhke 正是我的想法,每个整数都是 4 字节,所以它实际上是 931 * 4 GB!
有什么理由需要这么大的数组吗?你用它做什么?你能重构它吗?
【参考方案1】:
如果数据相对稀疏,那么您可以使用不同的数据结构,如here 或here 所述。
【讨论】:
【参考方案2】:不确定您是否意识到 10,000 x 10,000 x 10,000 整数(每个 4 字节)的 3 维数组总计 3725Gb!您可以使用-Xmx
标志增加堆大小,但这个数量仍然很大。
您需要更改程序的设计。
【讨论】:
这个问题本来是内存密集型的。我正在尝试创建一个需要解决的问题。但我不是故意让它那么密集。谢谢! 更糟糕的是,因为它是一个 3d 整数数组,所以也需要为整数子数组的对象指针留出空间。【参考方案3】:基本上你无法在记忆中保留那个维度的结构。 每个 int 占用 4 个字节。 所以你有 10.000 x 10.000 x 10.000 x 4 字节 = 4.000.000.000.000 字节,大约是 4 TB。 您需要将数据保存在数据库(相当大的数据库)中并根据需要访问它们。 第二种可能性是将数据保存在分布式内存系统中,例如在许多服务器上的分布式哈希表。例如 4000 台服务器和 1 GB 内存。
【讨论】:
以上是关于如何在不耗尽内存的情况下制作大型 3D 数组?的主要内容,如果未能解决你的问题,请参考以下文章
Google Big Query + PHP -> 如何在不耗尽内存的情况下获取大型数据集
如何使用 Python Ray 在不耗尽内存的情况下并行处理大量数据?